黑马程序员--java基础复习--集合
---------------------- ASP.Net+Android+IO开发S、.Net培训、期待与您交流! ---------------------
一、集合概述
1、集合与数组的比较:
首先要明白数据在计算机中的存储方式,常用的有数组、链表、哈希表和二叉树等。
所有的数组都用数组这个方式存储数据,这种方式查询快,但是插入、删除慢,而且是不可变长度的(数组的扩容其实是建立一个新的数组,增加原来数组的一半或者全长,然后将老数组中的数据copy到新数组中)
而集合则比较全面了,集合里边有各种底层实现方式,比如底层为数组的ArrayList、底层为链表的LinkedList、底层为哈希表的HashSet和HashMap,还有底层为二叉树的TreeSet和TreeMap。
集合在使用的时候不用考虑长度问题,即使是底层用数组实现的ArrayList也已经在内部封装好了自动扩容的功能,而且集合还能把不同的对象装在一起。
- 集合作为容器可以分为很多种,如水杯就有很多种。
- 多种集合的共性抽取,就是集合框架:Collection。 抽取的不一定能创建对象,所以需要参阅顶层创建子类对象。
- 集合中元素取出方式:迭代器、遍历、for循环、按角标索引 、枚举
3、集合框架
其中list是存入取出有序的(按角标),允许有重复元素
set是存入无序,不允许有重复元素,其实取出是有序的(HashSet按哈希值来取出,TreeSet按比较顺序来取出)
集合共性方法:
- 1.add方法: add方法的参数类型是Object,以便于接受任意类型对象。
- 2.集合中存储的都是对象中的引用(地址)。
- 栈里存放集合和数据对象的引用,堆中存放集合对象(包含数据对象的引用)、数据对象。
- 3.删除元素。
- remove("java02");//删除java02这个元素。
- clear(); //清空
- 4.判断元素
- al.contains("java02");//java02是否存在。
- al.isEmpty();//al是否为空。
- 5.取交集retainAll
- al1.tetainAll(al2);//取交集,没交集为空。
二、怎么使用集合
集合除了共性的增删改查方法外,还有一个共性的itrator方法,而且对于单列集合还可以使用collections的enumeration方法来获得对应的枚举迭代器,所以遍历集合的方法时非常多的。
用Iterator遍历集合时,只能用Iterator的方法来操作集合,不能用集合的方法来操作集合,因为会出现并发访问集合的安全问题,而Iterator中只有一个remove方法能对集合中的元素进行操作。
在ArrayList和LinkedList中还可以用ListIterator来遍历集合,这时候就可以有更多的操作了,比方说添加、修改等等。
在Map集合中,遍历就麻烦一点,有两种方法:keySet和entrySet,keySet是先拿到键的集合,再遍历键的集合时根据键找值,而entrySet则是直接遍历键值对。
三、各种集合使用需要注意的问题
当我们选定一个集合来使用的时候,必须要知道为什么使用这个集合,然后使用这个集合能达到什么效果,达到这个效果要符合什么条件。下面我一一列出来
ArrayList和LinkedList:就当数组用,记住ArrayList的查询快、删除添加慢,LinkedList增删的效率比ArrayList高。
HashSet和HashMap: 这两种集合装的对象必须重写hashCode和equals方法,因为他们的底层就是先通过hashCode来比较是不是相同事物,如果hashCode相同,再用equals比较是否相同。
TreeSet和TreeMap:这两种集合装的对象必须实现了comparable接口或者在创建集合的时候指定了比较器,因为这些集合只通过比compareTo(实现comparable接口)或者compare(用比较器)的返回值来判断事物是否相等。
四、集合面试题
转自http://blog.****.net/bingzhen66/article/details/8081063
---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
详细请查看:http://edu.****.net