HashMap和Hashtable一樣蕾殴,同樣都存儲(chǔ)的鍵值對(duì)员舵。
區(qū)別的地方主要區(qū)別在于
HashMap是線程不安全的棒仍,而Hashtable是線程安全的讯柔。
Hashtable在對(duì)集合操作的時(shí)候都加上了synchronized來(lái)保證線程的同步抡蛙。
HashMap可以使用null作為key,而Hashtable則不允許null作為key魂迄。
HashMap中如果key為null粗截,則key的hash則為0.
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
Hashtable如果傳入的key為null,則直接拋出控指針異常
public synchronized V put(K key, V value) {
// Make sure the value is not null
if (value == null) {
throw new NullPointerException();
}
}
HashMap的初始容量為16捣炬,Hashtable初始容量為11
兩者計(jì)算hash的方法不同
Hashtable計(jì)算hash是直接使用key的hashcode對(duì)table數(shù)組的長(zhǎng)度直接進(jìn)行取模
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
HashMap計(jì)算hash對(duì)key的hashcode進(jìn)行了二次hash熊昌,以獲得更好的散列值怠晴,然后對(duì)table數(shù)組長(zhǎng)度取摸
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
// 1.8中這句話是不存在的,是直接使用(n - 1) & hash浴捆,n是的大小
static int indexFor(int h, int length) {
return h & (length-1);
}