HashMap和Hashtable的区别
- 继承的父类不同。HashMap继承自AbstractMap类,而Hashtable继承自Dictionary类。但二者都实现了Map接口。
- HashMap不是线程安全的,Hashtable是线程安全的,Hashtable采用synchronized关键字保证方法的线程安全特性。
- HashMap允许key&value为空值,Hashtable不允许key&value为空值,否则会抛出空指针异常(如上图2所示)
- 都是通过hash来进行索引,但是hash处理方式不同。HashMap索引方式为hash(key.hashCode()) % (len-1),Hashtable的索引计算方式为key.hashCode() & 0x7FFFFFFF % len。两种不同的计算方式,直接导致扩容策略也有所差异。
- 初始化、扩容策略不同。
HashMap初始容量为16,当超过75%容量时,自动2倍扩容。
Hashtable初始容量为11,当超过75%容量时,自动2倍+1扩容。
额外得分点
- 说出JDK8对于HashMap的优化,当链表长度大于8时,采用红黑树的实现。如下图所示:
- 说出如何实现HashMap的线程安全。采用Collections工具类的synchronizedMap()方法,实现HashMap的线程安全。或使用ConcurrentHashMap代替HashMap(引导其进入ConcurrentHashMap的实现问题中来,接下来又可以胡吹一波了)。