可以这样简单的来对待容器中Map的分类:
Map.png
仅讨论Java.util包中的常见Map类,不涉及java.util.concurrent中的并发Map类
接口和抽象类
Map
Map没有继承Collection接口,Map提供key到value的映射。
一个Map中不能包含相同的key,每个key只能映射一个value。Map接口提供3种集合的视图,Map的内容可以被当作一组key集合,一组value集合,或者一组key-value映射。
AbstractMap
实现了Map中的绝大部分函数接口。它减少了“Map的实现类”的重复编码。
SortedMap
实现该接口,说明该Map依据key进行排序。
A Map that further provides a total ordering on its keys
NavigableMap
实现该接口,说明Map具有更多定位(或搜索)元素的方法。
A SortedMap extended with navigation methods returning the closest matches
for given search targets。
All of these methods are designed for locating, not traversing entries.
Dictionary
This class is obsolete. New implementations should implement the Map interface,
rather than extending this class
实现类
HashMap
数据结构为链表数组,key和value都允许null,未实现线程同步
(1)HashMap默认的容量大小是16;增加容量时,每次将容量变为原始容量x2。
(2)HashMap添加元素时,是使用自定义的哈希算法。
(3)通过Iterator迭代器遍历时:“从前向后”的遍历数组;再对数组具体某一项对应的链表,从表头开始进行遍历。
Hashtable
数据结构为链表数组,key和value都不允许null,实现了线程同步
(1)Hashtable默认的容量大小是11;增加容量时,每次将容量变为“原始容量x2 + 1”。
(2)Hashtable没有自定义哈希算法,而直接采用的key的hashCode()。
(3)通过Iterator迭代器遍历时:“从后向前”的遍历数组;再对数组具体某一项对应的链表,从表头开始进行遍历。
WeakHashMap
WeakHashMap是一种改进的HashMap,它对key实行弱引用,如果一个key不再被外部所引用,那么该key可以被GC回收。
LinkedHashMap
LinkedHashMap 是HashMap的一个子类,保存了记录的插入顺序。
在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的。
也可以在构造时用带参数,按照应用次数排序。
在遍历的时候会比HashMap慢,不过有种情况例外,当HashMap容量很大,实际数据较少时,遍历起来可能会比 LinkedHashMap慢,因为LinkedHashMap的遍历速度只和实际数据有关,和容量无关,而HashMap的遍历速度和他的容量有关。
区别在于HashMap并不是按插入次序顺序存放的,而LinkedHashMap是顺序存放的。
如果需要输出的顺序和输入的相同,那么用LinkedHashMap 可以实现,它还可以按读取顺序来排列。
TreeMap
TreeMap实现SortMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。
如果要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。
常见面试题
HashMap与HashTable的区别
都是无序存放
Hashtable线程同步(通过synchronized实现 ),HashMap线程不同步。
Hashtable不允许 null 值(key 和 value 都不可以),HashMap允许 null 值(key和value都可以)。
Hashtable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数:默认大小不同,扩容方式不同
HashMap提供对key的Set进行遍历(Iterator),因此它是fail-fast的,但HashTable提供对key的Enumeration进行遍历,它不支持fail-fast。
HashTable被认为是个遗留的类,如果你寻求在迭代的时候修改Map,你应该使用CocurrentHashMap。
参考
未一一列出,待补充