先来回顾一下集合类的关系图(来源于:http://blog.csdn.net/ns_code/article/details/35564663):
下文为提纲挈领的内容,欲知详情,请看本系列后面的文章。
HashSet & LinkedHashSet & TreeSet
1.HashSet,LinkedHashSet,TreeSet都不是线程安全的。
2.HashSet无序,LinkedHashSet记录元素放入的顺序,TreeSet按照给定的比较规则自动排序,适用于需要按序遍历的情况(利用红黑树实现)。
3.HashSet,LinkedHashSet都允许一个空值,TreeSet视情况而定。
4.TreeSet默认情况下不允许元素重复,但如果不正确地设置了比较器,结果不可预测。
Map & Set
两者实现不同的功能,无须多说。Java中在实现Set时,通常利用内置的Map来实现。
具体为:HashMap->HashSet,LinkedHashMap->LinkedHashSet,NavigableMap(TreeMap)->TreeSet
注:NavigableMap是对SortedMap的扩展。
HashMap & LinkedHashMap & TreeMap & WeakHashMap
1.HashMap,LinkedHashMap,TreeMap都不是线程安全的。
2.HashMap无序,LinkedHashMap记录键值的顺序,TreeMap按照给定的比较规则对键值排序,适用于需要按序遍历的情况(利用红黑树实现)。
3.HashMap,LinkedHashMap都允许一个空键值,TreeMap视情况而定。
4.TreeMap默认情况下不允许键值重复,但如果不正确地设置了比较器,结果不可预测。
5.WeakHashMap与HashMap相比,主要差别在于,它是以弱键实现的Map,没有实现Cloneable, java.io.Serializable等接口。
Hashtable & HashMap
1.HashMap是非线程安全的,Hashtable是线程安全的(相对而言)。
2.HashMap的键允许有null值存在,而Hashtable则不行。
3.HashMap效率比Hashtable高。
4.Hashtable除了实现了Map接口,还继承了Dictionary抽象类(功能与Map类似,但较古老)。
5.扩容方式不同,HashMap做了很大优化。
6.hashcode方式不同,HashMap做了很大优化。
Hashtable,Properties & 其它
1.Vector,Stack,Hashtable(Vector,Stack不是Map,因出现较早,一并拿出来比较)都是jdk1.2之前的产物(新集合是1.2才有的),都有不太理想的线程同步实现,不太理想的扩容方式,一般不推荐使用。
2.新版本的Vector,Stack,Hashtable也支持Iterator遍历,但和旧版本代码掺杂在一起,可读性较差。(一开始都是使用Enumeration遍历,后来都加入了Iterator)
3.Properties继承了Hashtable,但只用于配置文件的映射。