亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

深入Java集合學習系列:HashMap的實現(xiàn)原理(2)

系統(tǒng) 1773 0

5.??? HashMap 的性能參數(shù):

?? ? HashMap ? 包含如下幾個構(gòu)造器:

?? ? HashMap() :構(gòu)建一個初始容量為 ? 16 ,負載因子為 ? 0.75 ? ? HashMap

?? ? HashMap(int initialCapacity) :構(gòu)建一個初始容量為 ? initialCapacity ,負載因子為 ? 0.75 ? ? HashMap

?? ? HashMap(int initialCapacity, float loadFactor) :以指定初始容量、指定的負載因子創(chuàng)建一個 ? HashMap

?? ? HashMap 的基礎(chǔ)構(gòu)造器 HashMap(int initialCapacity, float loadFactor) 帶有兩個參數(shù),它們是初始容量 initialCapacity 和加載因子 loadFactor

?? ? initialCapacity HashMap 的最大容量,即為底層數(shù)組的長度。

?? ? loadFactor :負載因子 loadFactor 定義為:散列表的實際元素數(shù)目 (n)/ ? 散列表的容量 (m)

?? ? 負載因子衡量的是一個散列表的空間的使用程度,負載因子越大表示散列表的裝填程度越高,反之愈小。對于使用鏈表法的散列表來說,查找一個元素的平均時間是 O(1+a) ,因此如果負載因子越大,對空間的利用更充分,然而后果是查找效率的降低;如果負載因子太小,那么散列表的數(shù)據(jù)將過于稀疏,對空間造成嚴重浪費。

?? ? HashMap 的實現(xiàn)中,通過 threshold 字段來判斷 HashMap 的最大容量:

threshold = (int)(capacity * loadFactor);

結(jié)合負載因子的定義公式可知, threshold 就是在此 loadFactor capacity 對應下允許的最大元素數(shù)目,超過這個數(shù)目就重新 resize ,以降低實際的負載因子。默認的的負載因子 0.75 是對空間和時間效率的一個平衡選擇。當容量超出此最大容量時, ? resize 后的 HashMap 容量是容量的兩倍:

if (size++ >= threshold)?? ?
resize(2 * table.length);?

6.??? Fail-Fast 機制:

?? ? 我們知道 java.util.HashMap 不是線程安全的,因此如果在使用迭代器的過程中有其他線程修改了 map ,那么將拋出 ConcurrentModificationException ,這就是所謂 fail-fast 策略。

?? ? 這一策略在源碼中的實現(xiàn)是通過 modCount 域, modCount 顧名思義就是修改次數(shù),對 HashMap 內(nèi)容的修改都將增加這個值,那么在迭代器初始化過程中會將這個值賦給迭代器的 expectedModCount

HashIterator() {
expectedModCount = modCount;
if (size > 0) { // advance to first entry
Entry[] t = table;
while (index < t.length && (next = t[index++]) == null)
;
}
}

在迭代過程中,判斷 modCount expectedModCount 是否相等,如果不相等就表示已經(jīng)有其他線程修改了 Map:

?? 注意到 modCount 聲明為 volatile ,保證線程之間修改的可見性。

final Entry<K,V> nextEntry() {?? ?
if (modCount != expectedModCount)?? ?
throw new ConcurrentModificationException();

HashMap API 中指出:

?? ? 由所有 HashMap 類的 “collection ? 視圖方法 所返回的迭代器都是快速失敗的:在迭代器創(chuàng)建之后,如果從結(jié)構(gòu)上對映射進行修改,除非通過迭代器本身的 ? remove ? 方法,其他任何時間任何方式的修改,迭代器都將拋出 ? ConcurrentModificationException 。因此,面對并發(fā)的修改,迭代器很快就會完全失敗,而不冒在將來不確定的時間發(fā)生任意不確定行為的風險。

?? ? 注意,迭代器的快速失敗行為不能得到保證,一般來說,存在非同步的并發(fā)修改時,不可能作出任何堅決的保證。快速失敗迭代器盡最大努力拋出 ConcurrentModificationException 。因此,編寫依賴于此異常的程序的做法是錯誤的,正確做法是:迭代器的快速失敗行為應該僅用于檢測程序錯誤。

參考資料:

JDK API HashMap???? ? HashMap ? 源代碼???? ? 深入理解 HashMap

通過分析 JDK 源代碼研究 Hash 存儲機制 ??? ? java.util.HashMap源碼要點淺析

深入Java集合學習系列:HashMap的實現(xiàn)原理(2)


更多文章、技術(shù)交流、商務合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 狠狠色噜噜狠狠色综合久 | 亚洲最大在线观看 | 国产久草视频 | 特黄特黄aaaa级毛片免费看 | 狠狠干2022| 日本三级做a全过程在线观看 | 欧美成人性毛片免费版 | 黄色影院在线看 | 97视频在线观看免费视频 | 九九香蕉网 | 亚洲国产女人aaa毛片在线 | 亚洲国产视频在线观看 | 杨幂国产精品福利在线观看 | 日韩不卡免费视频 | 久久精品中文字幕 | 亚洲国产一区二区三区a毛片 | 99热视热频这里只有精品 | 天堂男人在线 | 欧美一级毛片欧美一级无片 | 亚洲va国产日韩欧美精品色婷婷 | 一级特黄特黄毛片欧美的 | 2019中文字幕视频 | 亚洲精品午夜久久久伊人 | a毛片 | 国产成人在线免费视频 | 99在线精品视频免费观里 | 免费福利小视频 | 99久久综合精品免费 | 亚洲精品自拍视频 | 久久亚洲欧美成人精品 | 亚洲日本人成中文字幕 | 99热久久这里只有精品7 | 久久国产视屏 | 亚洲国产精品成人综合久久久 | 精品国产综合区久久久久99 | 欧美视频性| 亚洲日日 | 日韩欧美一二区 | 国产精品成人69xxx免费视频 | 荡女人人爱np粗口 | 亚洲欧美日本国产综合在线 |