HashMap原始碼分析

2021-08-22 03:09:43 字數 1679 閱讀 5078

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 necessarily
final 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.預設引...