HashMap与HashTable主要有以下几个区别:
- 对Null Key和Null Value的支持
HashMap因为是非synchronized,所以允许key和value为null,但null作为键只能有一个,null作为值可有多个;而HashTable则不允许,否则会抛出NullPointerException异常。线程安全
HashMap是非synchronized,而Hashtable是synchronized,这意味着Hashtable是线程安全的,原因在于HashTable的put,get,remove方法在源码中被synchronized修饰定义成同步方法,保证了每个操作数据的方法在进行同步控制后,任何一个时刻只能有一个线程操作HashTable;HashMap是线程不安全的,多线程情况下不推荐使用HashMap,它的key,value运行为null。Java 5及以上提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的扩展性更好。初始化和扩容方式
HashTable中hash数组初始化大小及扩容方式不同。Hashtable默认的初始大小为11,之后每次扩充,容量变为原来的2n+1。HashMap默认的初始化大小为16。之后每次扩充,容量变为原来的2倍。继承的父类不同
HashMap和Hashtable不仅作者不同,而且连父类也是不一样的。HashMap是继承自AbstractMap类,而HashTable是继承自Dictionary类。不过它们都实现了同时实现了map、Cloneable(可复制)、Serializable(可序列化)这三个接口。底层数据结构
JDK1.8以后的HashMap在解决hash冲突时有较大改变,当链表长度大于阈值时(默认为8,且转换前会判断当前数组长度若小于64,则先进行数组扩容,而不是转换为红黑树),将链表转换为红黑树,以减少搜索事件。而HashTable则不具有该机制。



