HashTable与HashMap的区别

1、时间

HT产生于JDK1.1,HM产生于JDK1.2

2、作者

HT是3个作者,HM是4个作者,多了个Doug Lea

3、API

HashMap继承自抽象类AbstractMap

HashTable继承自抽象类Dictionary

HashMap在实现时对null做了特殊处理,将null的hashCode值定为了0,从而将其存放在哈希表的第0个bucket中。所以HashMap支持null键和null值

HashTable在遇到null时,会抛出NullPointerException异常

4、实现原理

HashMap/HashTable内部用Entry数组实现哈希表,而对于映射到同一个哈希桶(数组的同一个位置)的键值对,使用Entry链表来存储(解决hash冲突)。

HashTable默认的初始大小为11,之后每次扩充为原来的2n+1。

HashMap默认的初始化大小为16,之后每次扩充为原来的2倍。

5、线程安全

HashTable是同步的,HashMap不是

实现:公开的方法比如get都使用了synchronized描述符。而遍历视图比如keySet都使用了Collections.synchronizedXXX进行了同步包装

6、推荐使用

如果你不需要线程安全,那么使用HashMap,如果需要线程安全,那么使用ConcurrentHashMap。HashTable已经被淘汰了,不要在新的代码中再使用它。