HashTable vs HashMap vs TreeMap vs LinkedHashMap对比
一.总览
HashMap:是被实现为hash table,键值排列是无序的。
TreeMap: 是基于红黑树实现的,根据键进行排序的。
LinkedHashMap:根据插入顺序排序。
Hashtable:是同步的,对比HashMap多了同步的开销。
这就是为什么HashMap应使用在线程安全的情况下。因为不同步,所以在多线程的环境下,进行put()会导致多线程数据不一致。
二.HashMap
如果键是自定义的实体,需要重写 equals() 和 hashCode()。HashMap不允许两个相同的元素。默认情况下,会使用Object类中实现的hashCode()和equals()方法。默认的hashCode()方法为截然不同的对象提供了不同的整数,而equals()方法只有在两个引用引用同一对象时才返回true。
默认Object.equals()使用==作为比较,很显然对象这样对比是错误的。
三.TreeMap
TreeMap是按键排序的。
由于TreeMaps是按键排序的,所以键的对象必须能够相互比较,这就是为什么它必须实现可比较的接口。例如,使用String作为键,因为String实现了可比较的接口。
四.Hashtable
HashMap类大致相当于Hashtable,只不过它是不同步的,并且不允许key和value为null。
HashMap是HashTable的轻量级实现(非线程安全),HashMap可以通过collections.synchronizedMap()来达到同步效果。
五.LinkedHashMap
LinkedHashMap是HashMap的子类。这意味着它继承了HashMap的特性。此外,链表保留了插入顺序。
输出顺序与插入顺序是一样的。
补充:
- HashMap是HashTable的轻量级实现(非线程安全),HashMap可以通过collections.synchronizedMap()来达到同步效果。
- HashTable:contains,HashMap:containsKey、containsValue
- HashMap允许有一条记录的键为null,HashTable不允许。
- HashTable中hash数据默认大小为11,增加方式是old*2+1。在HashMap中,hash数组的默认大小是16,而且一定是2的指数。
- hash值的使用不同,HashTable直接使用对象的hashCode TreeMap实现SortMap接口,把保存的记录按键来排序。