Java HashMap原始碼小結

2021-07-28 02:54:44 字數 1632 閱讀 3708

本文基於jdk1.8.

hashmap即雜湊表,是一種能以常數平均時間完成插入,刪除和查詢操作的資料結構;

雜湊表有兩種實現方式:開放位址方式和衝突鍊錶方式;開放位址方式不需要使用鍊錶,但是要頻繁的再雜湊操作,常用的再雜湊方法有線性探測法,平方探測法,雙雜湊法。衝突鍊錶方式將所有雜湊值相同的鍵用鍊錶串起來,理想情況下的雜湊表每個雜湊值對應乙個鍵,此時查詢操作為常數時間;

有兩個引數與雜湊表的效能有關:容量capacity和裝載因子load_factor,threshold=capacity * load_factor;

雜湊表預設的容量是2^4;最大容量是2^30;裝載因子預設為0.75;

當裝入雜湊表的元素大於threshold時,雜湊表自動擴容,容量變為原來2倍,擴容後元素順序會被打散,在不同時間遍歷雜湊表得到的結果可能不同;

在jdk1.8中,鍊錶過長的話(長度》8),hashmap會將衝突鍊錶轉化為紅黑樹;

public class hashmapextends abstractmapimplements map, cloneable, serializable
其底層實現是由陣列和鍊錶構造而成,如圖:

public v get(object key)
通過傳入key得到value;

2. getnode(int hash, object key)

final nodegetnode(int hash, object key)  while ((e = e.next) != null);}}

return null;

}

tab[n-1]&hash是確定key在雜湊表中的位置;

然後在鍊錶中尋找(k==key || key.equals(k)),找k是否==key或equals key;返回node;

若需要將自定義的物件放入hashmap中,需要override equals方法和hashcode方法;

3. containskey(object key)

public boolean containskey(object key)
判斷雜湊表中是否存在這個key;

4. put

public v put(k key, v value)
將乙個鍵值對插入雜湊表;

5.remove

public v remove(object key)
將key對應的node從雜湊表中刪除;

和其他集合類的比較:hashset採用了介面卡模式(hashset裡有乙個hashmap);hashmap沒有實現同步,hashtable實現了同步,其餘類似;hashmap元素無序,treemap元素有序;

參考文章:

Java HashMap原始碼分析

hashset和hashmap是相同的實現 主要分析hashmap hashmap實現了map介面,允許放入null元素,與hashtable的主要區別是沒有實現執行緒安全,與treemap的主要區別是不能保證元素的順序,因此,不同時間迭代會得到不同的位置,hashmap是用衝突鍊錶法解決衝突 根據...

Java HashMap原始碼分析

在平時需要用到鍵值對儲存資料時,我們便會用到hashmap,這篇文章基於jdk1.8,參考前輩的文章,對hashmap進行一定的理解.面試必備 hashmap原始碼解析 jdk8 hashmap之比於arraylist和linkedlist,感覺原始碼複雜得多,由於才學疏淺,本文很大部分參考上面鏈結...

java hashmap原始碼學習二 put get

hashmap裡面兩個最重要的方法就是get和put 一 put object key 方法的實現 public v put k key,v value putval 的基本思路 1.要是table為空,則建立新的table 2.要是table length 1 hash key 為空,則建立新節點...