1 线程安全方面 HashMap是非线程安全的,HashTable是线程安全的
2 初始化容量 HashMap的初始化容量是 16,HashTable的初始化容量是 11,两者的扩容因子都是0.75
3 扩容方式 HashMap扩容时是当前容量翻倍 即 capacity*2,HashTable扩容时是当前容量翻倍+1 即 capacity*2+1
4 底层结构 HashMap与HashTable的底层实现都是数组+链表(单向)结构实现
5 HashMap 继承了AbstractMap,HashTable继承了Dictionary抽象类,两者均实现Map接口
6 哈希算法
HashTable计算hash是直接使用key的hashcode对table数组的长度直接进行取模:
int hash=key.hashCode();
int index=(hash & 0x7FFFFFFF) % tab.length
HashMap计算hash对key的hashCode进行了二次hash,以获得更好的散列值,然后对table数组长度取模
static in hash(int h){
h ^=(h >>> 20) ^(h >>>12);
return h^(h>>>7)^(h>>>4);
}
static int indexFor(int h,int length){
return h& (length-1);
}