HashMap和Hashtable的区别

61 阅读2分钟

掘金日新计划 · 6 月更文挑战」的第5天

HashMap

HashMap 是 map 接口的实现类,是将键映射到值的对象,它的键和值都是对象,并且不能包含重复键,但可以包含重复值。HashMap 允许key和value为空值。

HashMap中的方法没有synchronized修饰,所以HashMap是线程不安全的。

HashMap的底层实现:数组+链表

jdk8开始如果链表高度到8,数组的长度超过64,链表就会转变为红黑树,元素以内部类Node节点存在。

计算key的hash值,二次hash然后对数组长度取模,对应到数组下标,如果没有产生hash冲突(下标位置没有元素),则直接创建Node存入数组,如果产生hash冲突,则先进行equal比较,相同的话就会取代该元素,如果不同的话,则判断链表高度插入链表,链表高度达到8,并且数组长度到64则转变为红黑树,长度低于6则将红黑树转回链表。

由于HashMap是线程非安全的,所以HashMap在效率上要优于HashTable。

HashTable

HashTable中的方法都被Synchronized修饰,所以在多个线程访问HashTable时,不需要自己为它的方法实现同步。HashTable是线程安全的。

HashTable无论是key还是value,都不能为null值。

遍历方面:

HashMap只支持Iterator(迭代器)遍历。 而Hashtable支持Iterator(迭代器)和Enumeration(枚举器)两种方式遍历。

容量方面:

HashMap默认的容量大小是16;增加容量时,每次将容量变为“原始容量x2”。所以其容量一定是2的n次幂。 Hashtable默认的容量大小是11;增加容量时,每次将容量变为“原始容量x2 + 1”。