本文基於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 為空,則建立新節點...