Java 集合框架总结

总结如下:

1. 元素是否可以为null
除了hashtable外,Vector,ArrayList,LinkedList, TreeSet, HashSet, HashMap,LinkedHashMap,TreeMap 元素都可以为空

2. 是否线性安全
除hashtable,Vecotr外,其他都不是线程安全的。在外部添加锁的方法为 类似于
SortedSet s = Collections.synchronizedSortedSet(new TreeSet(…));

3. 元素是否可以重复
3. 1 显然实现List接口的都是可以重复的,而Set元素都是不会重复。
3.2 对于Map Key是不可以重复的,Value是可以重复的

4.元素是否有序
除TreeSet,TreeMap 都是有序的外,其他都是无序的,需要注意的是LinkedHashMap,ArrayList,LinkedList,Vector能保证迭代的元素与添加的顺序是一致。而HashMap,HashSet 遍历顺序与添加顺序不一致

5.底层实现原理
5.1 Vector,ArrayList底层就是数组 。
5.2 基于内部类Entry实现的
5.2.1 散列表 :HashMap ,HashSet数据结构为 table [Entry]。 Entry 为内部类(主要属性有next,value,key 其中next 属性用于解决hash碰撞)需要注意的是 HashSet 是基于HashMap 实现的,不同的是,HashSet对于内部类Entry 中的value属性统一为静态常量Object,HashSet中的元素就是Entry的Key。
5.2.2 双向循环链表:LinkedHashMap,LinkedList。LinkedHashMap继承自HashMap,但不同的是LinkedHashMap内部类Entry多了before和after两个属性,用于指向前面和后面的元素,以保持双向循环链表。而LinkedList中内部类中Entry属性并没有value,属性e就相当于是key, 属性previou相当于before ,属性next相当于after。
5.2.3 红黑二叉树:TreeMap,TreeSet。TreeMap内部类Entry与上面不同的属性为left,right,parent,color,分别表示为左节点,右节点,父节点,颜色。根据这些属性实现红黑二叉树。注意TreeSet是基于TreeMap实现,同HashSet一样,Entry的value也是都为静态常量Object。

6.性能比较
6.1 Vector与ArrayList :由于Vector是线性安全的,效率比ArrayList差
6.2 List,Set
6. 2.1 Set:检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变。
6. 2.2 List:和数组类似,List可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位置改变。
6.3 Map
3.1 HashMap:以空间换区时间,在hash碰撞率低的情况下,效率是非常高的
3.2 LikedHashMap:按照添加顺序存储,可以按添加顺序取出
3.3 TreeHashMap:排序性

7.适用场景
7.1 对于查找和删除较为频繁,且元素数量较多的应用,Set或Map是更好的选择
7.2 ArrayList适用于通过位置来读取元素的场景
7.3 LinkedList 适用于要头尾操作或插入指定位置的场景,或者是要求元素先进先出,因为LinkedList 实也现了poll方法()。
7.4 Vector 适用于要线程安全的ArrayList的场景
7.5 HashSet对排序没有要求需要去重的场景
7.6 TreeSet 需要排序、元素不重复
7.7 HashMap 适用于大部分 key-value形式的存储场景
7.8 LinkedHashMap 要求遍历顺序与传入顺序有关 key-value场景
7.9 TreeMap 需要排序的 key-value场景

最后附上集合结构关系图,画得比较烂,勿喷!

这里写图片描述

这里写图片描述

猜你喜欢

转载自blog.csdn.net/whandgdh/article/details/78899610