public v put(k key, v value)
if (key == null)
return putfornullkey(value);
int hash = hash(key);
int i = indexfor(hash, table.length);
for (entrye = table[i]; e != null; e = e.next)
}modcount++;
addentry(hash, key, value, i);
return
null;
}
a return value of does not necessarilyfinal entrygetentry(object key)
int hash = (key == null) ? 0 : hash(key);
for (entrye = table[indexfor(hash, table.length)];
e != null;
e = e.next)
return
null;
}
原始碼分析之indexfor
/**
* returns index for hash code h.
*/ static int indexfor(int h, int length)
常見面試問題總結
1、hash 函式或者是演算法的目的 ?
目的:找到key儲存的位置,hash函式設計的優劣會直接影響 key的分布是否均勻,是否會產生衝突、indexfor保證了陣列下標永遠不會越界
2、hashmap中的陣列的長度為啥是要 2 的次冪
3、陣列什麼時候擴容? 擴容多少?
4.hashmap和hashtable的比較
1.兩者最主要的區別在於hashtable是執行緒安全,而hashmap則非執行緒安全,hashtable的實現方法裡面都新增了synchronized關鍵字來確保執行緒同步,因此相對而言hashmap效能會高一些,我們平時使用時若無特殊需求建議使用hashmap,在多執行緒環境下若使用hashmap需要使用collections.synchronizedmap()方法來獲取乙個執行緒安全的集合。
2.hashmap可以使用null作為key,而hashtable則不允許null作為key,雖說hashmap支援null值作為key,不過建議還是盡量避免這樣使用,因為一旦不小心使用了,若因此引發一些問題,排查起來很是費事
3.hashmap是對map介面的實現,hashtable實現了map介面和dictionary抽象類,hashmap的初始容量為16,hashtable初始容量為11,兩者的填充因子預設都是0.75
4.hashmap擴容時是當前容量翻倍即:capacity*2,hashtable擴容時是容量翻倍+1即:capacity*2+1
5.兩者計算hash的方法不同,hashtable計算hash是直接使用key的hashcode對table陣列的長度直接進行取模
HashMap原始碼分析
public hashmap int initialcapacity,float loadfactor 2 接下來是重要的put方法,put方法用於將鍵值對儲存到map中,讓我們來具體分析一下。public v put k key,v value if key null 若key為null,則將va...
HashMap 原始碼分析
1 getentry object key 方法 final entrygetentry object key return null 根據key的hash值計算出索引,得到table中的位置,然後遍歷table處的鍊錶 for entrye table indexfor hash,table.le...
HashMap原始碼分析
size記錄了所有鍵值對的數目,包括陣列 內部實現 中的和陣列某些位置附屬鍊錶 hash值相同,不允許覆蓋已存在的鍵值對,所以要以鍊錶形式附加 中的鍵值對。hashmap的內部實現是陣列 鍊錶,通過鍵的hash值來定位鍵值對在陣列中的位置,是一種離散結構,所以陣列的某些索引上沒有儲存元素。1.預設引...