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已经被淘汰了,不要在新的代码中再使用它。