1. 默认初始容量和扩容方式不同
HashMap默认初始容量:16
HashTable默认初始容量:11
Hashtable扩容时,将容量变为原来的2倍加1,而HashMap扩容时,将容量变为原来的2倍。
2. 线程安全性不同
HashMap是非线程安全的,hashTable的每个方法都加有Synchronize关键字,是线程安全的
3. 继承的父类不同
HashMap继承自AbstractMap,HashTable继承自Dictionary类
4. K,V是否允许为NULL
HashMap 允许K,V为NULL,HashTable不允许K,V为NULL
5. Hash值不同
HashTable直接使用对象的hashCode。而HashMap重新计算hash值
//HashMap
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
//HashTable
int hash = key.hashCode();