大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 hot資訊 HashMap擴容機制解讀

HashMap擴容機制解讀

更新時間:2022-01-05 11:45:04 來源:動力節點 瀏覽2081次

何時擴容:

當 hashmap 中的元素數量超過數組大小 * loadFactor 時,Java數組擴容。loadFactor的默認值是_ LOAD_ 當hashmap中的元素個數超過16 * 0.75 = 12(閾值或邊界值)時,將數組的大小擴展為2 * 16 = 32,然后重新計算每個元素在hashmap中的位置數組。這是一個非常消耗性能的操作,所以我們最好能夠提前預測和設置元素的數量。

注意:

當hashmap中一個鏈表的對象個數達到8個時,如果數組長度沒有達到64,那么hashmap會先展開。如果達到64,就會變成紅黑樹,Node類型從Node變成TreeNode。當然,如果去掉映射關系,下一次執行reset()方法時,會判斷樹中的節點數小于6,也會將樹轉換為鏈表

什么是擴容

擴展會伴隨著新的hash分配,會遍歷hash表中的所有元素,非常耗時。在編寫程序的過程中,我們應該盡量避免resize()

每次擴充一倍,與原來的(n-1)&hash結果相比,只多了一位,所以節點要么在原來的位置,要么會被分配到“原來的位置+舊容量”的位置

原始數組長度:16 n = n - 1 ---> 15
(n - 1) & 散列
		 	 0000 0000 0000 0000 0000 0000 0001 0000 16
			 0000 0000 0000 0000 0000 0000 0000 1111 15 n - 1
hash1 (key1):1111 1111 1111 1111 0000 1111 0000 0101    
-------------------------------------------------- --------------
			 0000 0000 0000 0000 0000 0000 0000 1111 索引 5
			 
			 0000 0000 0000 0000 0000 0000 0000 1111 15 n - 1
hash2 (key2):1111 1111 1111 1111 0000 1111 0000 0101   
-------------------------------------------------- --------------
			 0000 0000 0000 0000 0000 0000 0000 1111 索引 5
================================================== ==============
數組長度擴展——> 16 * 32 n - 1 ---> 31
(n - 1) & 散列
			 0000 0000 0000 0000 0000 0000 0010 0000 32
			 0000 0000 0000 0000 0000 0000 0001 1111 31 n - 1
hash1(key1): 1111 1111 1111 1111 0000 1111 0000 0101   
-------------------------------------------------- --------------		 
			 0000 0000 0000 0000 0000 0000 0000 0101 索引 5
			 
			 0000 0000 0000 0000 0000 0000 0001 1111 31 n - 1
hash2 (key2):1111 1111 1111 1111 0000 1111 0000 0101   			
-------------------------------------------------- --------------			
			 0000 0000 0000 0000 0000 0000 0001 0101 指數 5 + 16

所以,元素重新計算hash后,因為N變成了兩倍,n-1的標簽范圍比高位多1位,所以新的索引會變成這樣

原來的位置=原來的位置+oldCap

注:5 為假設計算出的原始指標值,以驗證功能描述。擴容后節點要么在原位置,要么分配到“原位置+舊容量”位置

因此,我們在展開hash map時,不需要重新計算hash值。我們只需要看原始哈希值的新位是1還是0,

(0表示索引沒有變化,1表示原始索引+舊容量)

因為這種巧妙的rehash方法,不僅節省了重新計算hash值的時間,而且新的1位是0或1

這是隨機的。在reszie的過程中,保證rehash后每個bucket上的節點數必須小于等于原bucket上的節點數,從而保證rehash后不會出現更嚴重的hash沖突,并將之前的沖突節點均勻地分散到新的bucket中。

初始化映射說明:

HashMap 的擴展機制是在滿足擴展條件時進行擴展。HashMap 的擴展條件是當HashMap 中的元素個數超過閾值時,會自動擴展。因此,如果我們不設置初始容量,隨著元素數量的增加,HashMap 可能會擴展數倍。HashMap 中的擴展機制決定了每次都需要重新構建哈希表,極大地影響了性能。

關于設置HashMap的初始化容量:

可以認為,當我們知道HashMap中的元素個數時,將默認容量設置為initialCapacity/0.75F+1.0F從性能上來說是一個比較好的選擇,但也會犧牲一些內存。

Jdk 并沒有直接將用戶傳入的數作為默認容量,而是會進行一些計算,最終得到一個 2 的冪。

例子:

initalCapacity =(要存儲的元素數/負載因子)+ 1

默認情況下,負載因子為 0.75。如果暫時不能確定大小,建議設置為16

如果開始時沒有指定初始化因子。當需要放置1024個元素時,隨著元素數量的增加,需要擴容7倍并重建哈希表,嚴重影響性能。

提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 亚洲国产成人久久综合一区 | 中文成人在线 | 在线观看福利影院 | 亚洲两性| 青青青青啪视频在线观看 | 青青久久久国产线免观 | 狠狠狠狠狠狠狠狠 | 韩国亚洲伊人久久综合影院 | 精品国产一区二区三区四 | 色日韩 | 欧美80岁老妇一级毛片 | 女人18毛片a级18毛多水真多 | 玖玖射| 国产成人综合欧美精品久久 | 免费在线观看h片 | 伊人插插 | 99免费视频观看 | 玖玖视频精品 | 午夜香蕉网 | 国产精品福利久久香蕉中文 | 全亚洲最大的免费私人影剧院 | 午夜一级毛片免费视频 | 欧美国产伦久久久久 | 亚欧乱色精品免费观看 | 中文字幕免费在线 | 国产一区二区三区成人久久片 | 精品在线观看一区 | 91久久国产 | 欧美高清性粉嫩交 | 奇米在线观看 | 国产一区二区精品久久岳 | 国产九九在线观看播放 | 亚洲欧美日韩国产精品久久 | 国产亚洲精品久久yy5099 | 久草综合在线视频 | 国产一级二级在线观看 | 久久成年人视频 | 成人在线视频免费观看 | 四虎国产精品永免费 | 日韩精品亚洲人成在线播放 | 国产h版大片在线播放 |