集合的继承关系:
collection-------Set-------------EnumSet
HashSet--------------LinkedHashSet
SortedSet (I)------------TreeSet
-------------Queue(队列)-------Dqeue (I)-----------------ArrayDqeue
-----------------List---------------LinkedList
ArrayList
Vector------------------Stack
Collection中的集合说明:
1. Set 集合
Set集合不允许有重复元素,add( ) 方法返回 Boolean 值,表示是否添加成功
①HashSet:按 hash 算法来存储集合中的元素,有很好的存取和查找功能,其值可以为 null。
②LinkedHashSet:是HashSet 的子类,也是根据 元素的 hashCode 值决定元素的存储位置,同时使用链表维护元素的次序,使得看起来是以插入的顺序保存的。遍历时按照元素的添加顺序访问。它内部是HashSet存储,依然不允许集合元素重复。
③TreeSet:实现了SortedSet接口,所以有排序的状态。默认采用自然排序(不是插入顺序),可以定制排序。内部采用的是红黑树的数据结构来存储集合元素。
2. List 集合
List 集合代表一个有序、可重复的集合,默认按照添加顺序设置元素的索引。
①Vector:内部以数组实现,可变长度,用法上跟ArrayList几乎一样,虽然线程安全,但很古老,有很多缺点,尽量少用Vector。
②Stack:Stack是Vector的子类,模拟“栈”数据结构,“后进先出”的容器。进栈出栈都是Object对象,因此从栈中取出元素后要进行类型转换。提供了 i. Object peek( );返回栈的第一个元素,不出栈。ii. Object pop( );返回栈顶元素,出栈;iii. void push( Object o);压入栈顶。注意:Stack继承的是Vector,也是一个古老的类,线程安全,但性能较差,应尽量少用Stack类。如果真正需要“栈”这种数据结构,可以考虑使用 ArrayDeque。
③ArrayList:内部数组实现,默认长度10,可以在创建时指定长度,也可以指定自动增加的量。ArrayList是List集合的主要实现类,ArrayList是线程不安全的,若有多个线程同时访问一个ArrayList,必须手动保证该集合的同步性(使用Collections工具类)。
④LinkedList:(同时实现了Deque接口)采用双向列表实现,对数据的索引要从头开始遍历,因此随机访问的效果差,但是插入、删除元素时不用移动数据,因此插入效率较高,是非线程安全的容器。
⑤固定长度的List:使用Arrays工具类,提供了asList( Object ... o )方法,可以把一个数组或是指定个数的对象转换成一个List集合,这个List集合不是ArrayList、Vector的实现类,而是 Arrays类的内部类 ArrayList 的实例。长度固定,不可以添加或删除元素。
综合对比List集合:
- 如果需要遍历List元素,对于ArrayList、Vector集合,应该使用随机访问方法(get)来遍历集合元素,这样性能好;对于LinkedList集合,则应该采用迭代器(Iterator)来遍历元素。
- 如果需要经常执行插入、删除操作来改变包含大量数据的List集合的大小,可以考虑使用 LinkedList 集合。使用ArrayList、Vector集合可能需要经常重新分配内部数组的大小,效果可能较差。
- 如果有多个线程需要访问List集合中的元素,可以考虑使用 Collections 将集合包装成线程安全的集合。
Map集合的关系:
Map-----------------EnumMap
HashMap----------------LinkedHashMap
SortedMap--------------TreeMap
WeakHashMap
Hashtable---------------Properties
Map集合的说明:
①HashMap:
②LinkedHashMap:
③TreeMap:
④WeakHashMap:
⑤Hashtable:
⑥IdentityHashMap:
Map实现类的性能对比分析:
- 对于HashMap和Hashtable,二者的实现机制几乎一样,但由于Hashtable是一个古老的线程安全的集合,因此HashMap通常速度更快。
- TreeMap通常比HashMap、Hashtable要慢(尤其是在插入、删除K-V对时更慢),因为TreeMap底层采用红黑树来管理K-V对(红黑树的每个节点就是一个K-V对)。
- 使用Tree Map有个好处:TreeMap中的K-V对总是处于有序状态,无须专门排序。当TreeMap被填充以后,就可以调用keySet()方法,获取由Key组成的Set,然后调用toArray() 方法生成Key的数组,接下来使用Arrays的binarySearch()方法在已排序的数组中快速地查询对象。
- LinkedHashMap 比 HashMap 慢一点,因为要维护链表来保持Map中的key-value为添加顺序。IdentityHashMap性能没有特别出色,因为它采用HashMap基本相似的实现,只是内部使用 == 而不是 equals 方法判断元素相等。