成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

阿里巴巴Java開發手冊建議創建HashMap時設置初始化容量,但是多少合適呢?

開發 后端
集合是Java開發日常開發中經常會使用到的,而作為一種典型的K-V結構的數據結構,HashMap對于Java開發者一定不陌生。

[[315480]]

集合是Java開發日常開發中經常會使用到的,而作為一種典型的K-V結構的數據結構,HashMap對于Java開發者一定不陌生。

關于HashMap,很多人都對他有一些基本的了解,比如他和hashtable之間的區別、他和concurrentHashMap之間的區別等。這些都是比較常見的,關于HashMap的一些知識點和面試題,想來大家一定了熟于心了,并且在開發中也能有效的應用上。

但是,作者在很多次 CodeReview 以及面試中發現,有一個比較關鍵的小細節經常被忽視,那就是HashMap創建的時候,要不要指定容量?如果要指定的話,多少是合適的?為什么?

要設置HashMap的初始化容量

在《HashMap中傻傻分不清楚的那些概念》中我們曾經有過以下結論:

HashMap有擴容機制,就是當達到擴容條件時會進行擴容。HashMap的擴容條件就是當HashMap中的元素個數(size)超過臨界值(threshold)時就會自動擴容。在HashMap中,threshold = loadFactor * capacity。

所以,如果我們沒有設置初始容量大小,隨著元素的不斷增加,HashMap會發生多次擴容,而HashMap中的擴容機制決定了每次擴容都需要重建hash表,是非常影響性能的。

所以,首先可以明確的是,我們建議開發者在創建HashMap的時候指定初始化容量。并且《阿里巴巴開發手冊》中也是這么建議的:

 

 

 

 

HashMap初始化容量設置多少合適

那么,既然建議我們集合初始化的時候,要指定初始值大小,那么我們創建HashMap的時候,到底指定多少合適呢?

有些人會自然想到,我準備塞多少個元素我就設置成多少唄。比如我準備塞7個元素,那就new HashMap(7)。

但是,這么做不僅不對,而且以上方式創建出來的Map的容量也不是7。

因為,當我們使用HashMap(int initialCapacity)來初始化容量的時候,HashMap并不會使用我們傳進來的initialCapacity直接作為初始容量。

JDK會默認幫我們計算一個相對合理的值當做初始容量。所謂合理值,其實是找到第一個比用戶傳入的值大的2的冪。

也就是說,當我們new HashMap(7)創建HashMap的時候,JDK會通過計算,幫我們創建一個容量為8的Map;當我們new HashMap(9)創建HashMap的時候,JDK會通過計算,幫我們創建一個容量為16的Map。

但是,這個值看似合理,實際上并不盡然。因為HashMap在根據用戶傳入的capacity計算得到的默認容量,并沒有考慮到loadFactor這個因素,只是簡單機械的計算出第一個大約這個數字的2的冪。

loadFactor是負載因子,當HashMap中的元素個數(size)超過 threshold = loadFactor * capacity時,就會進行擴容。

也就是說,如果我們設置的默認值是7,經過JDK處理之后,HashMap的容量會被設置成8,但是,這個HashMap在元素個數達到 8*0.75 = 6的時候就會進行一次擴容,這明顯是我們不希望見到的。

那么,到底設置成什么值比較合理呢?

這里我們可以參考JDK8中putAll方法中的實現的,這個實現在guava(21.0版本)也被采用。

這個值的計算方法就是:

return (int) ((float) expectedSize / 0.75F + 1.0F);

比如我們計劃向HashMap中放入7個元素的時候,我們通過expectedSize / 0.75F + 1.0F計算,7/0.75 + 1 = 10 ,10經過JDK處理之后,會被設置成16,這就大大的減少了擴容的幾率。

當HashMap內部維護的哈希表的容量達到75%時(默認情況下),會觸發rehash,而rehash的過程是比較耗費時間的。所以初始化容量要設置成expectedSize/0.75 + 1的話,可以有效的減少沖突也可以減小誤差。(大家結合這個公式,好好理解下這句話)

所以,我們可以認為,當我們明確知道HashMap中元素的個數的時候,把默認容量設置成expectedSize / 0.75F + 1.0F 是一個在性能上相對好的選擇,但是,同時也會犧牲些內存。

這個算法在guava中有實現,開發的時候,可以直接通過Maps類創建一個HashMap:

Map

其代碼實現如下:

  1. public static <K, V> HashMap<K, V> newHashMapWithExpectedSize(int expectedSize) { 
  2.  
  3.     return new HashMap(capacity(expectedSize)); 
  4.  
  5.  
  6. static int capacity(int expectedSize) { 
  7.  
  8.     if (expectedSize < 3) { 
  9.  
  10.         CollectPreconditions.checkNonnegative(expectedSize, "expectedSize"); 
  11.  
  12.         return expectedSize + 1; 
  13.  
  14.     } else { 
  15.  
  16.         return expectedSize < 1073741824 ? (int)((float)expectedSize / 0.75F + 1.0F) : 2147483647; 
  17.  
  18.     } 
  19.  

但是,以上的操作是一種用內存換性能的做法,真正使用的時候,要考慮到內存的影響。但是,大多數情況下,我們還是認為內存是一種比較富裕的資源。

但是話又說回來了,有些時候,我們到底要不要設置HashMap的初識值,這個值又設置成多少,真的有那么大影響嗎?其實也不見得!

可是,大的性能優化,不就是一個一個的優化細節堆疊出來的嗎?

再不濟,以后你寫代碼的時候,使用Maps.newHashMapWithExpectedSize(7);的寫法,也可以讓同事和老板眼前一亮。

或者哪一天你碰到一個面試官問你一些細節的時候,你也能有個印象,或者某一天你也可以拿這個出去面試問其他人~!啊哈哈哈。

責任編輯:武曉燕 來源: Hollis(ID:hollischuang)
相關推薦

2019-04-15 08:49:59

阿里巴巴容量集合

2017-05-02 21:14:20

阿里巴巴Java開發

2025-04-17 08:47:23

2019-09-02 15:20:28

Java開發繼承

2019-09-04 11:02:54

繼承層次組合

2010-06-28 10:43:47

2020-12-18 10:55:51

阿里巴巴Redis數據庫

2018-05-29 14:57:59

HashMap容量初始化

2021-08-04 17:20:30

阿里巴巴AsyncJava

2013-08-22 09:41:52

阿里巴巴去IOE王堅

2009-06-11 13:26:16

Java數組聲明創建

2020-09-14 09:47:56

Java開發類型

2017-02-23 16:34:46

Java阿里巴巴

2013-08-22 09:36:45

阿里巴巴王堅阿里云

2019-08-15 10:25:02

代碼開發工具

2023-03-29 09:42:32

2009-02-27 10:46:32

DBA筆試題阿里巴巴

2021-04-28 20:44:01

HashMap容量性能

2012-03-22 17:07:03

阿里巴巴私有化

2020-04-28 10:54:13

運算符開發Java
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩欧美亚洲 | 精品国产乱码久久久久久丨区2区 | 鸡毛片 | 精品综合视频 | 久久综合一区 | 日日日干干干 | 亚洲午夜av久久乱码 | 颜色网站在线观看 | 九九久久精品 | 久久国产精99精产国高潮 | 欧美亚洲高清 | 天天草草草| 欧美a视频| 一区二区三区视频在线免费观看 | 精品福利一区二区三区 | 日本一区二区高清不卡 | 天天综合网7799精品 | 国产精品一区二区在线 | 99精品久久久久久中文字幕 | 日韩视频免费看 | 日本久久www成人免 成人久久久久 | 毛片一级网站 | 亚洲天堂免费在线 | 男人的天堂在线视频 | 婷婷99| 中文字幕1区 | 久久久久国产一区二区三区 | 成人黄色av| 中文字幕在线观看成人 | 国产精品久久久久久久久久久免费看 | 青青草国产在线观看 | 亚洲午夜在线 | av黄色在线播放 | 久久久久一区二区三区 | 一区中文字幕 | 不卡一区二区三区四区 | 精品欧美一区二区三区免费观看 | 久久久久久久久精 | 国产自产c区| 久久久一区二区三区四区 | 欧美一区二区在线观看视频 |