前面学习的时候对集合框架进行总结过,但是总结的不是很全面,所以再来补充一下
一、整体架构
如下是java集合框架的整体架构图
(1)集合接口:6个集合接口,表示不同类型的接口
(2)抽象类:5个抽象类,对集合接口的部分实现
(3)实现类:8个实现类,表示对接口的具体实现
以上的接口和实现类,我们不需要都学习,学习几个常用的即可。
二、Collection接口
Collection接口是最基本的集合接口,它不提供直接的实现,Java SDK提供的类都是继承自Collection的“子接口”如List和Set。Collection所代表的是一种规则,它所包含的元素都必须遵循一条或者多条规则。如有些允许重复而有些则不能重复、有些必须要按照顺序插入而有些则是散列,有些支持排序但是有些则不支持。
三、List接口
List接口为Collection直接接口。List所代表的是有序的Collection,即它用某种特定的插入顺序来维护元素顺序。用户可以对列表中每个元素的插入位置进行精确地控制,同时可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。实现List接口的集合主要有:ArrayList、LinkedList、Vector、Stack。
3.1 ArrayList
ArrayList是一个动态数组,也是我们最常用的集合。它允许任何符合规则的元素插入甚至包括null。每一个ArrayList都有一个初始容量(10),该容量代表了数组的大小。随着容器中的元素不断增加,容器的大小也会随着增加。在每次向容器中增加元素的同时都会进行容量检查,当快溢出时,就会进行扩容操作。
3.2 LinkList
同样实现List接口的LinkedList与ArrayList不同,ArrayList是一个动态数组,而LinkedList是一个双向链表。所以它除了有ArrayList的基本操作方法外还额外提供了get,remove,insert方法在LinkedList的首部或尾部。
由于实现的方式不同,LinkedList不能随机访问,它所有的操作都是要按照双重链表的需要执行。在列表中索引的操作将从开头或结尾遍历列表(从靠近指定索引的一端)。这样做的好处就是可以通过较低的代价在List中进行插入和删除操作。
3.3 Vector
与ArrayList相似,但是Vector是同步的。所以说Vector是线程安全的动态数组。它的操作与ArrayList几乎一样。
3.4 Stack
Stack继承自Vector,实现一个后进先出的堆栈。Stack提供5个额外的方法使得Vector得以被当作堆栈使用。基本的push和pop 方法,还有peek方法得到栈顶的元素,empty方法测试堆栈是否为空,search方法检测一个元素在堆栈中的位置。Stack刚创建后是空栈。
四、Set接口
4.1 HashSet
HashSet堪称查询速度最快的集合,因为其内部是以HashCode来实现的。它内部元素的顺序是由哈希码来决定的,所以它不保证set 的迭代顺序;特别是它不保证该顺序恒久不变。
4.2 TreeSet
Comparator
进行排序,具体取决于使用的构造方法。
五、Map接口
Map与List、Set接口不同,它是由一系列键值对组成的集合,提供了key到Value的映射。同时它也没有继承Collection。在Map中它保证了key与value之间的一一对应关系。也就是说一个key对应一个value,所以它不能存在相同的key值,当然value值可以相同。实现map的有:HashMap、TreeMap、HashTable、Properties、EnumMap。
5.1 HashMap
5.2TreeMap
5.3 HashTable
六、比较异同
List接口为Collection直接接口。List所代表的是有序的Collection,即它用某种特定的插入顺序来维护元素顺序。用户可以对列表中每个元素的插入位置进行精确地控制,同时可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。实现List接口的集合主要有:ArrayList、LinkedList、Vector、Stack。
6.1 ArrayList和LinkList
ArrayList是基于动态数组的,而LinkList是基于双向链表的,随机访问中,ArrayList要占优势,因为LinkList是链表的结构,需要来回移动指针,而在插入和删除上LinkList更占优势,因为ArrayList需要移动数据,其每插入一个元素就要移动所用的数据。
6.2 Vector和ArrayList
Vector是线程同步和线程安全的,而ArrayList是线程不同步和线程不安全的,正是因为Vector是线程同步的,所以其性能和ArrayList相比要差。
6.3 Vector和ArrayList
与ArrayList相似,但是Vector是同步的。所以说Vector是线程安全的动态数组。它的操作与ArrayList几乎一样。
参考文章:
http://blog.csdn.net/chenssy/article/details/17732841
http://blog.csdn.net/erlian1992/article/details/51277677