精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

「Java」HashMap底層實現、加載因子、容量值及死循環

開發 后端
HashMap是一個基于哈希表實現的無序的key-value容器,它鍵和值允許設置為 null,同時它是線程不安全的。

HashMap 簡介

HashMap是一個基于哈希表實現的無序的key-value容器,它鍵和值允許設置為 null,同時它是線程不安全的。

HashMap 底層實現

  •  在jdk 1.7中HashMap是以數組+鏈表的實現的
  •  在jdk1.8開始引入紅黑樹,HashMap底層變成了數組+鏈表+紅黑樹實現

紅黑樹簡介

紅黑樹是一種特殊的平衡二叉樹,它有如下的特征:

  •  節點是紅色或黑色
  •  根節點是黑色的
  •  所有葉子都是黑色。(葉子是NULL節點)
  •  每個紅色節點的兩個子節點都是黑色的(從每個葉子到根的所有路徑上不能有兩個連續的紅色節點)
  •  從任一節點到其每個葉子的所有路徑都包含相同數目的黑色節點。

所以紅黑樹的時間復雜度為: O(lgn)。

jdk1.8:數組+鏈表+紅黑樹

HashMap的底層首先是一個數組,元素存放的數組索引值就是由該元素的哈希值(key-value中key的哈希值)確定的,這就可能產生一種特殊情況——不同的key哈希值相同。

在這樣的情況下,于是引入鏈表,如果key的哈希值相同,在數組的該索引中存放一個鏈表,這個鏈表就包含了所有key的哈希值相同的value值,這就解決了哈希沖突的問題。

但是如果發生大量哈希值相同的特殊情況,導致鏈表很長,就會嚴重影響HashMap的性能,因為鏈表的查詢效率需要遍歷所有節點。于是在jdk1.8引入了紅黑樹,當鏈表的長度大于8,且HashMap的容量大于64的時候,就會將鏈表轉化為紅黑樹。 

  1. // jdk1.8  
  2. // HashMap#putVal  
  3. // binCount 是該鏈表的長度計數器,當鏈表長度大于等于8時,執行樹化方法  
  4. // TREEIFY_THRESHOLD = 8  
  5. if (binCount >= TREEIFY_THRESHOLD - 1)  
  6.     treeifyBin(tab, hash);  
  7. // HashMap#treeifyBin      
  8. final void treeifyBin(Node<K,V>[] tab, int hash) {  
  9.     int n, index; Node<K,V> e;  
  10.     // MIN_TREEIFY_CAPACITY=64  
  11.     // 若 HashMap 的大小小于64,僅擴容,不樹化  
  12.     if (tab == null || (n = tab.length) < MIN_TREEIFY_CAPACITY 
  13.         resize();  
  14.     else if ((e = tab[index = (n - 1) & hash]) != null) {  
  15.         TreeNode<K,V> hd = nulltl = null 
  16.         do { 
  17.              TreeNode<K,V> p = replacementTreeNode(e, null);  
  18.             if (tl == null)  
  19.                 hd = p
  20.              else {  
  21.                 p.prev = tl
  22.                  tl.next = p 
  23.             }  
  24.             tl = p 
  25.         } while ((ee = e.next) != null);  
  26.         if ((tab[index] = hd) != null)  
  27.             hd.treeify(tab);  
  28.     }  

加載因子為什么是0.75

所謂的加載因子,也叫擴容因子或者負載因子,它是用來進行擴容判斷的。

假設加載因子是0.5,HashMap初始化容量是16,當HashMap中有16 * 0.5=8個元素時,HashMap就會進行擴容操作。

而HashMap中加載因子為0.75,是考慮到了性能和容量的平衡。

由加載因子的定義,可以知道它的取值范圍是(0, 1]。

  •  如果加載因子過小,那么擴容門檻低,擴容頻繁,這雖然能使元素存儲得更稀疏,有效避免了哈希沖突發生,同時操作性能較高,但是會占用更多的空間。
  •  如果加載因子過大,那么擴容門檻高,擴容不頻繁,雖然占用的空間降低了,但是這會導致元素存儲密集,發生哈希沖突的概率大大提高,從而導致存儲元素的數據結構更加復雜(用于解決哈希沖突),最終導致操作性能降低。
  •  還有一個因素是為了提升擴容效率。因為HashMap的容量(size屬性,構造函數中的initialCapacity變量)有一個要求:它一定是2的冪。所以加載因子選擇了0.75就可以保證它與容量的乘積為整數。 
  1. // 構造函數  
  2. public HashMap(int initialCapacity, float loadFactor) {  
  3.     // ……  
  4.     this.loadFactor = loadFactor;// 加載因子  
  5.     this.threshold = tableSizeFor(initialCapacity);  
  6.  
  7. /**  
  8.  * Returns a power of two size for the given target capacity.返回2的冪  
  9.  * MAXIMUM_CAPACITY = 1 << 30  
  10.  */  
  11. static final int tableSizeFor(int cap) {  
  12.     int n = cap - 1;  
  13.     n |= n >>> 1;  
  14.     n |= n >>> 2; 
  15.     n |= n >>> 4;  
  16.     n |= n >>> 8;  
  17.     n |= n >>> 16;  
  18.     return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;  

HashMap 的容量為什么是2的 n 次冪

HashMap的默認初始容量是16,而每次擴容是擴容為原來的2倍。這里的16和2倍就保證了HashMap的容量是2的n次冪,那么這樣設計的原因是什么呢?

原因一:與運算高效

與運算&,基于二進制數值,同時為1結果為1,否則就是0。如1&1=1,1&0=0,0&0=0。使用與運算的原因就是對于計算機來說,與運算十分高效。

原因二:有利于元素充分散列,減少 Hash 碰撞

在給HashMap添加元素的putVal函數中,有這樣一段代碼: 

  1. // n為容量,hash為該元素的hash值  
  2. if ((p = tab[i = (n - 1) & hash]) == null)  
  3.     tab[i] = newNode(hash, key, value, null); 

它會在添加元素時,通過i = (n - 1) & hash計算該元素在HashMap中的位置。

當 HashMap 的容量為 2 的 n 次冪時,他的二進制值是100000……(n個0),所以n-1的值就是011111……(n個1),這樣的話(n - 1) & hash的值才能夠充分散列。

舉個例子,假設容量為16,現在有哈希值為1111,1110,1011,1001四種將被添加,它們與n-1(15的二進制=01111)的哈希值分別為1111、1110、1110、1011,都不相同。

而假設容量不為2的n次冪,假設為10,那么它與上述四個哈希值進行與運算的結果分別是:0101、0100、0001、0001。

可以看到后兩個值發生了碰撞,從中可以看出,非2的n次冪會加大哈希碰撞的概率。所以 HashMap 的容量設置為2的n次冪有利于元素的充分散列。

參考:HashMap初始容量為什么是2的n次冪及擴容為什么是2倍的形式

HashMap 是如何導致死循環的

HashMap會導致死循環是在jdk1.7中,由于擴容時的操作是使用頭插法,在多線程的環境下可能產生循環鏈表,由此導致了死循環。在jdk1.8中改為使用尾插法,避免了該死循環的情況。 

 

責任編輯:龐桂玉 來源: segmentfault
相關推薦

2013-06-06 13:34:56

HashMap線程不安全

2020-12-17 07:39:30

HashMap死循環數據

2023-01-04 07:54:03

HashMap底層JDK

2025-01-21 00:00:00

HashMap死循環數據損壞

2020-09-29 15:24:07

面試數據結構Hashmap

2022-01-20 08:44:25

HashMap死循環開放性

2022-01-18 06:59:50

HashMap循環底層

2023-07-11 08:00:00

2023-01-31 08:24:55

HashMap死循環

2022-01-13 06:59:40

HashMap底層面試

2011-08-29 16:23:29

Lua腳本

2021-08-29 07:41:48

數據HashMap底層

2015-10-09 09:43:53

云環境CPU虛擬化底層容量

2023-10-18 10:55:55

HashMap

2020-08-19 16:36:53

HashMap紅黑樹閾值

2018-10-10 20:20:14

2011-09-07 10:13:04

IPv6IPv4

2024-12-06 16:00:00

C++頭文件

2013-06-06 13:10:44

HashMap無鎖

2025-09-03 07:18:07

點贊
收藏

51CTO技術棧公眾號

欧美大黑bbbbbbbbb在线| 欧日韩在线视频| 天堂中文字幕av| 福利视频一区二区三区| 在线观看视频一区二区 | 午夜一级在线看亚洲| 久久激情久久| 亚洲一区www| 国产在线拍揄自揄视频不卡99| 久久久久久夜| 久久精品视频免费| 国产精品久久99久久| 手机成人在线| 日本黄色小说视频| 亚洲大片精品免费| 欧美日韩久久久| 人妻久久久一区二区三区| yw视频在线观看| 国产成人免费在线| 国产精品国产福利国产秒拍| 欧美黑人精品一区二区不卡| 国产探花在线精品| 精品av久久707| 中文字幕亚洲乱码| 菠萝蜜视频在线观看www入口| jizz久久久久久| 国产精品无码永久免费888| 亚洲婷婷综合色高清在线| 在线观看91精品国产麻豆| 欧美一级欧美一级| 97caopron在线视频| 亚洲国产精品av| 鲁丝一区二区三区免费| 成人激情四射网| 激情六月婷婷久久| 国产精品久久久久9999| 天堂网中文字幕| 1024日韩| 中文字幕在线看视频国产欧美在线看完整| 无码人妻精品一区二区三区温州 | 日本高清不卡在线| 久久午夜无码鲁丝片| 93在线视频精品免费观看| 亚洲片av在线| 黄色录像a级片| 菁菁伊人国产精品| 精品成人在线观看| 黄色av电影网站| 亚洲三级av| 日韩视频永久免费| 日本黄色www| 9999精品免费视频| 91精品国产综合久久小美女| 在线观看国产一级片| 成人免费av电影| 在线观看国产日韩| 在线免费观看av的网站| 国产成人精品一区二区三区在线| 欧洲精品中文字幕| 另类小说第一页| 国产成人毛片| 在线播放视频一区| 一级黄色高清视频| 麻豆国产精品| 亚洲福利视频专区| 99re久久精品国产| 国产精品嫩草影院在线看| 亚洲欧美国产高清va在线播| 日韩丰满少妇无码内射| 成人免费看片39| 久久精品人人做人人爽| 日韩女优一区二区| 亚洲全部视频| 日本在线观看天堂男亚洲 | 久久亚洲导航| 精品国产成人在线| 爆乳熟妇一区二区三区霸乳| 丰满少妇一区| 欧美mv日韩mv| 欧美一区二区三区成人精品| 波多野结衣在线播放一区| 久久国产一区二区三区| 国产在线拍揄自揄拍| 久久成人亚洲| 91免费看国产| 污污的视频网站在线观看| 久久精品一区蜜桃臀影院| 杨幂一区欧美专区| 不卡av免费观看| 91九色02白丝porn| 91大神免费观看| 日韩人体视频| 精品国产网站地址| 日韩高清精品免费观看| 日韩精品一卡二卡三卡四卡无卡| 96国产粉嫩美女| 日韩porn| 亚洲精选在线视频| 熟女人妇 成熟妇女系列视频| 久久免费资源| 日韩精品小视频| 糖心vlog免费在线观看| 国产日韩欧美三区| 亚洲a区在线视频| 在线观看xxx| 亚洲精品国产视频| 天天爽天天爽夜夜爽| av自拍一区| 最近2019年手机中文字幕| 福利一区二区三区四区| 极品少妇一区二区三区精品视频| 精品伦精品一区二区三区视频| 视频免费一区| 欧美色另类天堂2015| 制服下的诱惑暮生| 日韩精品免费| 啪一啪鲁一鲁2019在线视频| 国产高清在线免费| 国产精品久久久久久久久晋中| 欧美精品自拍视频| 日本一区二区乱| 中文字幕av一区二区三区谷原希美| 精品无码久久久久久久| 久久99精品久久久久久久久久久久| 国产亚洲第一区| 亚洲wwwww| 欧美精品一二三| 欧美黄色一级生活片| 99亚洲一区二区| 成人av中文| 18+激情视频在线| 欧美日韩国产电影| 日本免费www| 久久亚洲美女| 麻豆91av| 日韩伦理在线| 亚洲福利视频专区| 日本少妇激情视频| 成人免费视频视频| 日韩精品视频在线观看视频| 香蕉成人app| 久久6精品影院| 精品国产无码AV| 一区二区三区日韩| 女人扒开双腿让男人捅| 91成人国产| 日韩av成人在线观看| 国产情侣av在线| 国产精品成人免费在线| 超碰在线人人爱| 精品国产午夜| 国产精品天天狠天天看| av电影在线观看网址| 在线看日本不卡| 国产成人免费观看网站| 秋霞午夜av一区二区三区| 日韩在线导航| 日韩色性视频| 九九视频这里只有精品| 国产三级在线观看视频| 一区二区三区四区在线播放| av影片在线播放| 一区福利视频| 乱色588欧美| 日韩经典一区| 久久久精品久久| 亚洲成人一二三区| 亚洲国产一区在线观看| 深爱五月激情网| 奇米一区二区三区av| 视频一区二区视频| 在线精品视频一区| 欧洲精品在线视频| 午夜免费视频在线国产| 欧美一区二区三区视频免费| 久久精品国产亚洲av高清色欲| 成人手机在线视频| 欧美极品欧美精品欧美图片| 日韩情爱电影在线观看| av成人综合网| 欧美男体视频| 理论片在线不卡免费观看| 高h震动喷水双性1v1| 色老头久久综合| 久久高清内射无套| 91原创在线视频| 中文字幕av专区| 在线视频观看日韩| 亚洲日本精品| 久久资源综合| 成人av在线网址| 第一福利在线视频| 在线观看日韩专区| 亚洲欧美强伦一区二区| 欧美视频在线一区二区三区| 欧美爱爱小视频| 国产三级精品在线| 日本一区二区免费视频| 日本亚洲免费观看| 欧日韩免费视频| 999精品一区| 久久久com| 久久久精品区| 国产精品极品美女粉嫩高清在线| 宅男在线观看免费高清网站| 亚洲美女性生活视频| www.国产三级| 欧美日韩精品高清| 久久精品一二区| 亚洲精品高清在线观看| 卡一卡二卡三在线观看| 成人黄色777网| 一二三av在线| 蜜臀va亚洲va欧美va天堂| 国产精品成人久久电影| 99久久九九| 日韩免费中文专区| 欧美大片网址| 成人资源av| www一区二区三区| 国产精品视频中文字幕91| 小草在线视频免费播放| 欧美日本国产在线| 黄色视屏免费在线观看| 一区二区三区无码高清视频| 香蕉av一区二区三区| 日韩三级免费观看| 国产精品污视频| 欧美精品黑人性xxxx| 免费在线观看av的网站| 日韩欧美在线免费| 四虎成人精品永久免费av| 一个色在线综合| 欧美黑人精品一区二区不卡| 亚洲精品中文字幕在线观看| 久久嫩草捆绑紧缚| 中文字幕一区在线观看视频| 成人黄色短视频| 中文欧美字幕免费| 2017亚洲天堂| 国产精品美女久久久久久久| 黄色三级生活片| 国产精品久久久久一区二区三区 | 国产一区二区在线播放视频| 欧美亚洲国产一卡| 欧美高清69hd| 欧美日韩国产经典色站一区二区三区| 中文字幕黄色av| 欧美日韩高清不卡| 一区二区久久精品66国产精品| 欧美精品在线视频| 国产丰满果冻videossex| 日韩精品资源二区在线| 亚洲国产精品久久久久爰性色| 日韩欧美一级在线播放| 免费av一级片| 日韩精品视频在线免费观看| 免费在线观看一级毛片| 亚洲天堂久久av| 免费的黄网站在线观看| 美女撒尿一区二区三区| 国产丝袜精品丝袜| 51久久精品夜色国产麻豆| 欧美人体一区二区三区| 国产精品流白浆视频| 欧美v亚洲v综合v国产v仙踪林| 91免费国产网站| 久久365资源| 日本一区免费观看| 欧美激情另类| 日韩一级片免费视频| 久久一二三四| 手机免费看av网站| 成人性视频网站| mm131美女视频| 国产精品电影一区二区| 激情视频在线播放| 动漫精品一区二区| 亚洲特级黄色片| 亚洲精品一区二区在线观看| 可以在线观看的黄色| 日韩中文字幕网| 成人性生交大片免费看在线播放| 欧美最近摘花xxxx摘花| 日韩av懂色| 国产偷国产偷亚洲高清97cao| 国产精品一国产精品| 先锋影音男人资源| 午夜亚洲福利在线老司机| www激情五月| 99久久国产综合色|国产精品| 国产7777777| 亚洲午夜精品在线| 中文字幕人成人乱码亚洲电影| 日韩视频一区在线观看| 精品视频一二三| 色综合91久久精品中文字幕| 丝袜美腿一区| 国产精品久久久久久免费观看 | 中文字幕日韩高清| 3344国产永久在线观看视频| 国产噜噜噜噜噜久久久久久久久| 风间由美一区二区av101| 亚洲日本欧美在线| 国产精品免费看| 黑人巨大猛交丰满少妇| 国产欧美日韩亚州综合| 亚洲国产精品午夜在线观看| 69堂亚洲精品首页| 国产一区二区影视| 国内久久久精品| 精品久久国产一区| 日韩影视精品| 老司机亚洲精品| 天天躁日日躁狠狠躁av麻豆男男| 1区2区3区精品视频| 国产一卡二卡三卡| 亚洲国产精品电影在线观看| 国产在线观看a| 国产欧美一区二区三区视频| 美女久久99 | 日本视频一区二区| 性久久久久久久久久| 亚洲国产精品久久人人爱| 国产精品高潮呻吟av| 中文字幕日韩高清| 成人视屏在线观看| 久久天堂国产精品| 亚洲免费黄色| 亚洲欧美日韩色| 亚洲综合激情网| 精品久久人妻av中文字幕| 日韩中文有码在线视频| 日韩精品免费观看视频| 欧美日本韩国一区二区三区| aⅴ色国产欧美| 亚洲欧美日韩偷拍| 亚洲国产毛片aaaaa无费看| 国产成人精品亚洲精品色欲| 久久久国产91| 精品成人18| 男同互操gay射视频在线看| 麻豆精品视频在线观看| 污污视频网站在线免费观看| 精品视频一区二区三区免费| 北岛玲一区二区三区| 国产精品专区第二| 色喇叭免费久久综合网| 五月天激情视频在线观看| 国产精品久久久久久亚洲伦| 中文字幕777| 久久久电影免费观看完整版| 欧美9999| 国产美女主播在线播放| 99久久99久久精品免费观看| 久久99国产综合精品免费| 亚洲人成自拍网站| 欧美美女被草| 色一情一乱一乱一区91| 成人在线视频一区| 日本三级免费看| 亚洲日本成人女熟在线观看| 日本美女久久| 在线综合视频网站| 国产成人综合视频| 特一级黄色大片| 永久免费精品影视网站| 亚洲免费资源| av在线免费观看国产| 91年精品国产| 波多野结衣电影在线播放| 久久韩国免费视频| 国产精品xxxav免费视频| 可以免费观看av毛片| 国产精品久线在线观看| 亚洲国产精品一| 人妖精品videosex性欧美| 成人综合久久| 韩国三级视频在线观看| 色呦呦一区二区三区| 免费观看在线黄色网| 国外成人在线视频网站| 99人久久精品视频最新地址| 国产精品久久久久久成人| 日韩午夜电影在线观看| 成人福利av| 玖玖精品在线视频| 久久先锋影音av鲁色资源| 国产尤物视频在线观看| 午夜精品在线视频| sdde在线播放一区二区| 国内自拍偷拍视频| 欧美性三三影院| 国产盗摄——sm在线视频| 午夜一区二区三视频在线观看| 国产成人8x视频一区二区| 小泽玛利亚一区二区三区视频| 欧美精品videossex88| 不卡视频在线| 亚洲一区二区观看|