掘金日新计划 · 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”。