国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

HashMap中傻傻分不清楚的那些概念

開發(fā) 開發(fā)工具
很多人在通過閱讀源碼的方式學習Java,這是個很好的方式。而JDK的源碼自然是首選。在JDK的眾多類中,我覺得HashMap及其相關的類是設計的比較好的。很多人讀過HashMap的代碼,不知道你們有沒有和我一樣,覺得HashMap中關于容量相關的參數(shù)定義的太多了,傻傻分不清楚。

很多人在通過閱讀源碼的方式學習Java,這是個很好的方式。而JDK的源碼自然是***。在JDK的眾多類中,我覺得HashMap及其相關的類是設計的比較好的。很多人讀過HashMap的代碼,不知道你們有沒有和我一樣,覺得HashMap中關于容量相關的參數(shù)定義的太多了,傻傻分不清楚。

[[230071]]

其實,這篇文章介紹的內(nèi)容比較簡單,只要認真的看看HashMap的原理還是可以理解的,單獨寫一篇文章的原因是因為我后面還有幾篇關于HashMap源碼分析的文章,這些概念不熟悉的話閱讀后面的文章會很吃力。

HashMap中重要的成員變量

先來看一下,HashMap中都定義了哪些成員變量。

上面是一張HashMap中主要的成員變量的圖,其中有一個是我們本文主要關注的: size、loadFactor、threshold、DEFAULT_LOAD_FACTOR和DEFAULT_INITIAL_CAPACITY。

我們先來簡單解釋一下這些參數(shù)的含義,然后再分析他們的作用。

HashMap類中有以下主要成員變量:

  • transient int size; 

記錄了Map中KV對的個數(shù)

  • loadFactor 

裝載印子,用來衡量HashMap滿的程度。loadFactor的默認值為0.75f(static final float DEFAULT_LOAD_FACTOR = 0.75f;)。

  • int threshold; 

臨界值,當實際KV個數(shù)超過threshold時,HashMap會將容量擴容,threshold=容量*加載因子

  • 除了以上這些重要成員變量外,HashMap中還有一個和他們緊密相關的概念:capacity 

容量,如果不指定,默認容量是16(static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;)

可能看完了你還是有點蒙,size和capacity之間有啥關系?為啥要定義這兩個變量。loadFactor和threshold又是干啥的?

size 和 capacity

HashMap中的size和capacity之間的區(qū)別其實解釋起來也挺簡單的。我們知道,HashMap就像一個“桶”,那么capacity就是這個桶“當前”最多可以裝多少元素,而size表示這個桶已經(jīng)裝了多少元素。來看下以下代碼:

  1. Map<String, String> map = new HashMap<String, String>(); 
  2. map.put("hollis""hollischuang"); 
  3.  
  4. Class<?> mapType = map.getClass(); 
  5. Method capacity = mapType.getDeclaredMethod("capacity"); 
  6. capacity.setAccessible(true); 
  7. System.out.println("capacity : " + capacity.invoke(map)); 
  8.  
  9. Field size = mapType.getDeclaredField("size"); 
  10. size.setAccessible(true); 
  11. System.out.println("size : " + size.get(map)); 

我們定義了一個新的HashMap,并想其中put了一個元素,然后通過反射的方式打印capacity和size。輸出結(jié)果為:capacity : 16、size : 1

默認情況下,一個HashMap的容量(capacity)是16,設計成16的好處我在《全網(wǎng)把Map中的hash()分析的最透徹的文章,別無二家。》中也簡單介紹過,主要是可以使用按位與替代取模來提升hash的效率。

為什么我剛剛說capacity就是這個桶“當前”最多可以裝多少元素呢?當前怎么理解呢。其實,HashMap是具有擴容機制的。在一個HashMap***次初始化的時候,默認情況下他的容量是16,當達到擴容條件的時候,就需要進行擴容了,會從16擴容成32。

我們知道,HashMap的重載的構(gòu)造函數(shù)中,有一個是支持傳入initialCapacity的,那么我們嘗試著設置一下,看結(jié)果如何。

  1. Map<String, String> map = new HashMap<String, String>(1); 
  2. map.put("hahaha""hollischuang"); 
  3.  
  4. Class<?> mapType = map.getClass(); 
  5. Method capacity = mapType.getDeclaredMethod("capacity"); 
  6. capacity.setAccessible(true); 
  7. System.out.println("capacity : " + capacity.invoke(map)); 
  8.  
  9. Map<String, String> map = new HashMap<String, String>(7); 
  10. map.put("hahaha""hollischuang"); 
  11.  
  12. Class<?> mapType = map.getClass(); 
  13. Method capacity = mapType.getDeclaredMethod("capacity"); 
  14. capacity.setAccessible(true); 
  15. System.out.println("capacity : " + capacity.invoke(map)); 
  16.  
  17.  
  18. Map<String, String> map = new HashMap<String, String>(9); 
  19. map.put("hahaha""hollischuang"); 
  20.  
  21. Class<?> mapType = map.getClass(); 
  22. Method capacity = mapType.getDeclaredMethod("capacity"); 
  23. capacity.setAccessible(true); 
  24. System.out.println("capacity : " + capacity.invoke(map)); 

分別執(zhí)行以上3段代碼,分別輸出:capacity : 2、capacity : 8、capacity : 16。

也就是說,默認情況下HashMap的容量是16,但是,如果用戶通過構(gòu)造函數(shù)指定了一個數(shù)字作為容量,那么Hash會選擇大于該數(shù)字的***個2的冪作為容量。(1->2、7->8、9->16)

這里有一個小建議:在初始化HashMap的時候,應該盡量指定其大小。尤其是當你已知map中存放的元素個數(shù)時。(《阿里巴巴Java開發(fā)規(guī)約》)

loadFactor 和 threshold

前面我們提到過,HashMap有擴容機制,就是當達到擴容條件時會進行擴容,從16擴容到32、64、128...

那么,這個擴容條件指的是什么呢?

其實,HashMap的擴容條件就是當HashMap中的元素個數(shù)(size)超過臨界值(threshold)時就會自動擴容。

在HashMap中,threshold = loadFactor * capacity。

loadFactor是裝載因子,表示HashMap滿的程度,默認值為0.75f,設置成0.75有一個好處,那就是0.75正好是3/4,而capacity又是2的冪。所以,兩個數(shù)的乘積都是整數(shù)(capacity為2也同樣)。

對于一個默認的HashMap來說,默認情況下,當其size大于12(16*0.75)時就會觸發(fā)擴容。

驗證代碼如下:

  1. Map<String, String> map = new HashMap<>(); 
  2. map.put("hollis1""hollischuang"); 
  3. map.put("hollis2""hollischuang"); 
  4. map.put("hollis3""hollischuang"); 
  5. map.put("hollis4""hollischuang"); 
  6. map.put("hollis5""hollischuang"); 
  7. map.put("hollis6""hollischuang"); 
  8. map.put("hollis7""hollischuang"); 
  9. map.put("hollis8""hollischuang"); 
  10. map.put("hollis9""hollischuang"); 
  11. map.put("hollis10""hollischuang"); 
  12. map.put("hollis11""hollischuang"); 
  13. map.put("hollis12""hollischuang"); 
  14. Class<?> mapType = map.getClass(); 
  15.  
  16. Method capacity = mapType.getDeclaredMethod("capacity"); 
  17. capacity.setAccessible(true); 
  18. System.out.println("capacity : " + capacity.invoke(map)); 
  19.  
  20. Field size = mapType.getDeclaredField("size"); 
  21. size.setAccessible(true); 
  22. System.out.println("size : " + size.get(map)); 
  23.  
  24. Field threshold = mapType.getDeclaredField("threshold"); 
  25. threshold.setAccessible(true); 
  26. System.out.println("threshold : " + threshold.get(map)); 
  27.  
  28. Field loadFactor = mapType.getDeclaredField("loadFactor"); 
  29. loadFactor.setAccessible(true); 
  30. System.out.println("loadFactor : " + loadFactor.get(map)); 
  31.  
  32. map.put("hollis13""hollischuang"); 
  33. Method capacity = mapType.getDeclaredMethod("capacity"); 
  34. capacity.setAccessible(true); 
  35. System.out.println("capacity : " + capacity.invoke(map)); 
  36.  
  37. Field size = mapType.getDeclaredField("size"); 
  38. size.setAccessible(true); 
  39. System.out.println("size : " + size.get(map)); 
  40.  
  41. Field threshold = mapType.getDeclaredField("threshold"); 
  42. threshold.setAccessible(true); 
  43. System.out.println("threshold : " + threshold.get(map)); 
  44.  
  45. Field loadFactor = mapType.getDeclaredField("loadFactor"); 
  46. loadFactor.setAccessible(true); 
  47. System.out.println("loadFactor : " + loadFactor.get(map)); 

輸出結(jié)果:

  1. capacity : 16 
  2. size : 12 
  3. threshold : 12 
  4. loadFactor : 0.75 
  5.  
  6. capacity : 32 
  7. size : 13 
  8. threshold : 24 
  9. loadFactor : 0.75 

當HashMap中的元素個數(shù)達到13的時候,capacity就從16擴容到32了。

HashMap中還提供了一個支持傳入initialCapacity,loadFactor兩個參數(shù)的方法,來初始化容量和裝載因子。不過,一般不建議修改loadFactor的值。

總結(jié)

HashMap中size表示當前共有多少個KV對,capacity表示當前HashMap的容量是多少,默認值是16,每次擴容都是成倍的。loadFactor是裝載因子,當Map中元素個數(shù)超過loadFactor* capacity的值時,會觸發(fā)擴容。loadFactor* capacity可以用threshold表示。

【本文是51CTO專欄作者Hollis的原創(chuàng)文章,作者微信公眾號Hollis(ID:hollischuang)】

戳這里,看該作者更多好文

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2021-03-10 08:56:37

Zookeeper

2021-07-27 07:31:16

JavaArrayList數(shù)組

2022-05-15 21:52:04

typeTypeScriptinterface

2024-02-29 09:08:56

Encoding算法加密

2021-02-14 22:33:23

Java字符字段

2020-10-30 08:20:04

SD卡TF卡存儲

2018-12-17 12:30:05

Kubernetes存儲存儲卷

2020-03-03 17:35:09

Full GCMinor

2023-02-27 15:46:19

數(shù)據(jù)元元數(shù)據(jù)

2025-08-18 03:25:00

2023-09-03 21:18:07

Python編程語言

2021-11-09 06:01:35

前端JITAOT

2021-02-08 23:47:51

文件存儲塊存儲對象存儲

2025-05-12 08:40:00

前端監(jiān)控DOM

2025-08-14 08:21:17

PODAODTO

2022-02-25 09:14:33

類變量共享實例變量

2016-11-04 12:51:46

Unix網(wǎng)絡IO 模型

2024-11-04 00:00:03

viewportDOMSPA

2025-08-26 04:00:00

2023-04-11 15:57:49

JavaScriptCSSHTML
點贊
收藏

51CTO技術棧公眾號

99久久精品无码一区二区毛片| 国产精品稀缺呦系列在线| a优女a优女片| 国产精品theporn| 中文字幕日韩精品在线| 在线播放你懂得| 成人激情校园春色| 古典武侠综合av第一页| 最新国产精品精品视频| 欧美va日韩va| 深夜视频在线免费| 国产日韩精品一区二区浪潮av | 羞羞免费视频| 紧缚奴在线一区二区三区| 91色在线视频| 任你弄精品视频免费观看| 正在播放亚洲1区| 日本色护士高潮视频在线观看| 亚洲国产精品久久人人爱蜜臀 | 欧美成人亚洲| 国产v综合v亚洲欧美久久| 国产精品一区二区美女视频免费看 | 国产成人精品福利| 亚洲视频欧美视频| 91麻豆免费在线视频| 欧美性少妇18aaaa视频| 成人黄色电影在线| 国产精品另类一区| 亚洲精品一二三四五区| va亚洲va日韩不卡在线观看| 潘金莲一级淫片aaaaa免费看| 伊人成人在线视频| 成人有码在线播放| 欧美亚洲激情| 国产精品久久久久久av福利| 蜜桃精品wwwmitaows| 欧美在线观看视频| 欧美美女黄色| 欧美影院久久久| 欧洲精品一区| 国产精品日韩欧美综合| 精品高清在线| 亚洲一区二区三区久久| 欧美成人中文| 九色91国产| 久久综合伊人| 涩涩涩999| 国产一区二区三区免费播放 | 日韩免费看片| 国产精品老女人视频| 你懂的一区二区三区| 国产精品自产拍在线观看| 欧美成人首页| 亚洲福利av在线| 国产精品羞羞答答xxdd| 丝袜老师办公室里做好紧好爽| 国产日韩v精品一区二区| 国产1区2区视频| 在线视频欧美区| 97在线超碰| 欧美伦理91i| 日韩国产一区二区三区| 狠狠色噜噜狠狠狠狠色吗综合| 日韩不卡免费视频| 日本午夜激情视频| 亚洲免费看黄网站| 97最新国自产拍视频在线完整在线看| 欧美v日韩v国产v| 日本综合视频| 日本精品一区二区三区在线| 国产一区视频在线观看免费| 在线观看免费91| 91小视频在线观看| 在线麻豆国产传媒1国产免费| 这里只有精品视频在线观看| 成人国产二区| 国产成人91久久精品| 国产精品入口66mio| 干日本少妇视频| 国产精品久久久久天堂| 国产中文在线视频| 亚洲福利视频免费观看| 日韩精品一区国产| 91九色对白| 成人免费观看av| 在线观看黄色| 在线观看精品自拍私拍| 欧美一区二区三| 一区二区三视频| 国产精品伦理在线| 午夜伦理在线视频| 亚洲国产高清高潮精品美女| 91精品国产自产在线丝袜啪| 精品国产综合| 国产视频911| 在线播放免费av| 欧美亚洲伦理www| 日韩国产在线观看| 成人嫩草影院免费观看| 日韩视频一区二区三区在线播放| 岛国精品一区| 午夜视频久久久| 亚洲最新视频在线播放| 草美女在线观看| 国产欧美精品久久久| 国内一区二区视频| 国产系列电影在线播放网址| 色综合视频网站| 免费观看久久久4p| 三级视频网站在线| 欧美www在线| 蜜臀久久99精品久久久画质超高清| 香港日本韩国三级| www.亚洲成人| 奇米色777欧美一区二区| 亚洲色图16p| 午夜精品国产精品大乳美女| 国产综合色在线视频区| 成人在线观看黄色| 国产91热爆ts人妖在线| 成人午夜精品在线| av免费在线观| 亚洲伊人久久综合| 国产精品黄色在线观看| 亚洲第一会所001| 日本a级片久久久| 色哟哟一区二区| 欧美男同视频网| 北条麻妃av高潮尖叫在线观看| 亚洲精品720p| 麻豆精品网站| 1024免费在线视频| 成人羞羞国产免费| 亚洲综合久久av| 免费成人三级| 欧美日韩第二页| 日韩一区二区久久久| 国产综合色精品一区二区三区| 蜜桃av在线免费观看| 国产99在线播放| 色综合天天性综合| 国产精品88久久久久久| 永久免费不卡在线观看黄网站| 欧美激情第99页| 久久综合狠狠综合久久综合88 | 欧美色一级片| 永久www成人看片| 日本91av在线播放| 国产欧美在线观看一区| 91嫩草国产线观看亚洲一区二区| 欧美黄网在线观看| 亚洲乱码国产乱码精品精98午夜 | 国产欧美婷婷中文| www精品美女久久久tv| 欧美free嫩15| 午夜啪啪免费视频| 欧美精品一区二区三区久久久| 久色成人在线| 超碰高清在线| 欧妇女乱妇女乱视频| 日韩中文字幕精品视频| 成人在线综合网| 欧美一级免费| 天天综合网日韩| 琪琪第一精品导航| 精品久久在线播放| 最新日韩av| 黄色在线论坛| 亚洲精品影院| 色老头一区二区三区在线观看| 成人av在线播放网址| 国产精品欧美日韩久久| 欧美日韩破处视频| www.欧美日本| 欧美中文字幕视频| 午夜欧美视频在线观看| 欧美1区2区视频| 污视频在线免费观看网站| 麻豆传媒网站在线观看| 欧美日韩国产999| 一区二区高清视频在线观看| 97国产成人高清在线观看| 日本高清中文字幕在线| 亚洲最新在线| 欧美成人全部免费| 亚洲va欧美va天堂v国产综合| 国模吧视频一区| 亚洲美女炮图| 国产免费又粗又猛又爽| 成人情趣片在线观看免费| 欧美草草影院在线视频| 成人国产精品免费观看动漫 | 日韩电影免费观看高清完整| 亚洲国产99精品国自产| 国产·精品毛片| 青青草97国产精品麻豆| 污污的网站在线看| 波多结衣在线观看| 久久99精品国产99久久| 另类色图亚洲色图|