HashMap原始碼分析

2022-03-17 02:58:20 字數 1563 閱讀 8363

1.       hashmap 是基於雜湊表的map介面的實現。 

這個實現提供了所有可選的對映操作,並且允許key與value為null

hashmap類大致等同於hashtable,除了它是不同步並允許空值。這個類沒***map的順序; 特別是不保證這個順序

將隨時間保持不變。

2.    

這個實現為基礎提供了恆定的效能

操作get 和put ,假設雜湊函式在桶之間正確地分散元素。

對收集檢視的迭代需要 hashmap例項的「容量」(桶的數量)加上其大小(鍵值對映的數量)的時間比例。

因此,如果迭代效能很重要,不要將初始容量設定得太高(或者負載因子太低)。

3.    

乙個hashmap有兩個引數影響他的效能,初始容量和負載因子

容量是雜湊表中桶的數量,以及初始值容量就是雜湊表建立時的容量。

「負載因子」是在雜湊表的容量自動增加之前,雜湊表得到多少容量的一種度量。

當雜湊表中的條目數量(number of entries)超過負載因子和當前容量的乘積時,雜湊表被重新構造(即,內部資料結構被重建),使得雜湊表具有大約 桶數的兩倍。

4.一般來說,預設載入因子(.75)提供了時間和空間成本之間的良好折衷。

較高的值會減少空間開銷,但會增加查詢成本(反映在大部分hashmap類的操作中,包括get和put)。

在設定其初始容量時,應考慮map中預期的數量及其載荷因子,以儘量減少

雜湊表被重新構造的次數。

如果初始容量大於條目數量最大數除以負載因子,則不會發生重新重新整理操作。

如果在hashmap例項中要存入很多元素,那麼在初始化hashmap例項的時候,初始化乙個足夠大容量的例項,會更加有效的儲存,而不是讓它根據需要自動重新雜湊來增長表。

5.請注意,此實現不同步。

如果多個執行緒同時訪問雜湊對映,並且至少有乙個

執行緒在結構上修改了地圖,它必須被外部同步。

(結構修改是增加或刪除乙個或多個鍵值對(entrie),對已有key的value值的修改不是結構修改。)

這個一般是通過一些自然地封裝的物件來完成同步的

如果沒有這樣的物件存在,map應該使用「包裝」方法。 這最好在創作時完成,以防對map的不同步訪問:

map m = collections.synchronizedmap(new hashmap(...)); 

6.所有這個類的「集合檢視方法」返回的迭代器都是快速失敗的:

如果地圖在迭代器建立後的任何時候都在結構上被修改,

除了通過迭代器自己的remove 方法之外,迭代器將丟擲異常。

因此,在併發修改的情況下,迭代器快速而乾淨地失敗,而不是在未來的未定的時間冒著任意的,不確定的行為冒險。

7.請注意,迭代器的快速失敗無法得到保證,因為一般來說,在非同步併發修改的情況下無法做出任何硬性保證。

快速失敗會使 迭代器盡可能地丟擲concurrentmodificationexception

因此依賴這個異常而得到正確性,去編寫乙個程式是錯誤的

迭代器的快速失敗行為應該僅用於檢測錯誤。

這個類是集合框架的一員

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原始碼分析

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.nex...