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

我說我了解集合類,面試官竟然問我為啥HashMap的負載因子不設置成1!?

開發 后端
在Java基礎中,集合類是很關鍵的一塊知識點,也是日常開發的時候經常會用到的。比如List、Map這些在代碼中也是很常見的。

 [[315953]]

在Java基礎中,集合類是很關鍵的一塊知識點,也是日常開發的時候經常會用到的。比如List、Map這些在代碼中也是很常見的。

個人認為,關于HashMap的實現,JDK的工程師其實是做了很多優化的,要說所有的JDK源碼中,哪個類埋的彩蛋最多,那我想HashMap至少可以排前五。

也正是因為如此,很多細節都容易被忽視,今天我們就來關注其中一個問題,那就是:

為什么HashMap的負載因子設置成0.75,而不是1也不是0.5?這背后到底有什么考慮?

大家千萬不要小看這個問題,因為負載因子是HashMap中很重要的一個概念,也是高端面試的一個??键c。

另外,這個值得設置,有些人會用錯的,比如前幾天我的《阿里巴巴Java開發手冊建議創建HashMap時設置初始化容量,但是多少合適呢?》這篇文章中,就有讀者這樣回復:

既然有人會嘗試著去修改負載因子,那么到底改成1是不是合適呢?為什么HashMap不使用1作為負載因子的默認值呢?

什么是loadFactor

首先我們來介紹下什么是負載因子(loadFactor),如果讀者對這部分已經有了解,那么可以直接跨過這一段。

我們知道,第一次創建HashMap的時候,就會指定其容量(如果未明確指定,默認是16,詳見為啥HashMap的默認容量是16?),那隨著我們不斷的向HashMap中put元素的時候,就有可能會超過其容量,那么就需要有一個擴容機制。

所謂擴容,就是擴大HashMap的容量:

  1. void addEntry(int hash, K key, V value, int bucketIndex) { 
  2.     if ((size >= threshold) && (null != table[bucketIndex])) { 
  3.         resize(2 * table.length); 
  4.         hash = (null != key) ? hash(key) : 0; 
  5.         bucketIndex = indexFor(hash, table.length); 
  6.     } 
  7.     createEntry(hash, key, value, bucketIndex); 

從代碼中我們可以看到,在向HashMap中添加元素過程中,如果 元素個數(size)超過臨界值(threshold) 的時候,就會進行自動擴容(resize),并且,在擴容之后,還需要對HashMap中原有元素進行rehash,即將原來桶中的元素重新分配到新的桶中。

在HashMap中,臨界值(threshold) = 負載因子(loadFactor) * 容量(capacity)。

loadFactor是裝載因子,表示HashMap滿的程度,默認值為0.75f,也就是說默認情況下,當HashMap中元素個數達到了容量的3/4的時候就會進行自動擴容。(詳見HashMap中傻傻分不清楚的那些概念)

為什么要擴容

還記得前面我們說過,HashMap在擴容到過程中不僅要對其容量進行擴充,還需要進行rehash!所以,這個過程其實是很耗時的,并且Map中元素越多越耗時。

rehash的過程相當于對其中所有的元素重新做一遍hash,重新計算要分配到那個桶中。

那么,有沒有人想過一個問題,既然這么麻煩,為啥要擴容?HashMap不是一個數組鏈表嗎?不擴容的話,也是可以無限存儲的呀。為啥要擴容?

這其實和哈希碰撞有關。

哈希碰撞

我們知道,HashMap其實是底層基于哈希函數實現的,但是哈希函數都有如下一個基本特性:根據同一哈希函數計算出的哈希值如果不同,那么輸入值肯定也不同。但是,根據同一哈希函數計算出的哈希值如果相同,輸入值不一定相同。

兩個不同的輸入值,根據同一哈希函數計算出的哈希值相同的現象叫做碰撞。

衡量一個哈希函數的好壞的重要指標就是發生碰撞的概率以及發生碰撞的解決方案。

而為了解決哈希碰撞,有很多辦法,其中比較常見的就是鏈地址法,這也是HashMap采用的方法。詳見全網把Map中的hash()分析的最透徹的文章,別無二家。

HashMap將數組和鏈表組合在一起,發揮了兩者的優勢,我們可以將其理解為鏈表的數組。

HashMap基于鏈表的數組的數據結構實現的。

我們在向HashMap中put元素的時候,就需要先定位到是數組中的哪條鏈表,然后把這個元素掛在這個鏈表的后面。

當我們從HashMap中get元素的時候,也是需要定位到是數組中的哪條鏈表,然后再逐一遍歷鏈表中的元素,直到查找到需要的元素為止。

但是,如果一個HashMap中沖突太高,那么數組的鏈表就會退化為鏈表。這時候查詢速度會大大降低。

所以,為了保證HashMap的讀取的速度,我們需要想辦法盡量保證HashMap的沖突不要太高。

擴容避免哈希碰撞

那么如何能有效的避免哈希碰撞呢?

我們先反向思維一下,你認為什么情況會導致HashMap的哈希碰撞比較多?

無外乎兩種情況:

1、容量太小。容量小,碰撞的概率就高了。狼多肉少,就會發生爭搶。

2、hash算法不夠好。算法不合理,就可能都分到同一個或幾個桶中。分配不均,也會發生爭搶。

所以,解決HashMap中的哈希碰撞也是從這兩方面入手。

這兩點在HashMap中都有很好的體現。兩種方法相結合,在合適的時候擴大數組容量,再通過一個合適的hash算法計算元素分配到哪個數組中,就可以大大的減少沖突的概率。就能避免查詢效率低下的問題。

為什么默認loadFactor是0.75

至此,我們知道了loadFactor是HashMap中的一個重要概念,他表示這個HashMap最大的滿的程度。

為了避免哈希碰撞,HashMap需要在合適的時候進行擴容。那就是當其中的元素個數達到臨界值的時候,而這個臨界值前面說過和loadFactor有關,換句話說,設置一個合理的loadFactor,可以有效的避免哈希沖突。

那么,到底loadFactor設置成多少算合適呢?

這個值現在在JDK的源碼中是0.75:

  1. /** 
  2.  * The load factor used when none specified in constructor. 
  3.  */ 
  4.  
  5. static final float DEFAULT_LOAD_FACTOR = 0.75f; 

那么,為什么選擇0.75呢?背后有什么考慮?為什么不是1,不是0.8?不是0.5,而是0.75呢?

在JDK的官方文檔中,有這樣一段描述描述:

As a general rule, the default load factor (.75) offers a good tradeoff between time and space costs. Higher values decrease the space overhead but increase the lookup cost (reflected in most of the operations of the HashMap class, including get and put).

大概意思是:一般來說,默認的負載因子(0.75)在時間和空間成本之間提供了很好的權衡。更高的值減少了空間開銷,但增加了查找成本(反映在HashMap類的大多數操作中,包括get和put)。

試想一下,如果我們把負載因子設置成1,容量使用默認初始值16,那么表示一個HashMap需要在"滿了"之后才會進行擴容。

那么在HashMap中,最好的情況是這16個元素通過hash算法之后分別落到了16個不同的桶中,否則就必然發生哈希碰撞。而且隨著元素越多,哈希碰撞的概率越大,查找速度也會越低。

0.75的數學依據

另外,我們可以通過一種數學思維來計算下這個值是多少合適。

我們假設一個bucket空和非空的概率為0.5,我們用s表示容量,n表示已添加元素個數。

用s表示添加的鍵的大小和n個鍵的數目。根據二項式定理,桶為空的概率為:

P(0) = C(n, 0) * (1/s)^0 * (1 - 1/s)^(n - 0)

因此,如果桶中元素個數小于以下數值,則桶可能是空的:

log(2)/log(s/(s - 1))

當s趨于無窮大時,如果增加的鍵的數量使P(0) = 0.5,那么n/s很快趨近于log(2):

log(2) ~ 0.693...

所以,合理值大概在0.7左右。

當然,這個數學計算方法,并不是在Java的官方文檔中體現的,我們也無從考察到底有沒有這層考慮,就像我們根本不知道魯迅寫文章時候怎么想的一樣,只能推測。這個推測來源于Stack Overflow(https://stackoverflow.com/questions/10901752/what-is-the-significance-of-load-factor-in-hashmap)

0.75的必然因素

理論上我們認為負載因子不能太大,不然會導致大量的哈希沖突,也不能太小,那樣會浪費空間。

通過一個數學推理,測算出這個數值在0.7左右是比較合理的。

那么,為什么最終選定了0.75呢?

還記得前面我們提到過一個公式嗎,就是臨界值(threshold) = 負載因子(loadFactor) * 容量(capacity)。

我們在《為啥HashMap的默認容量是16?》中介紹過,根據HashMap的擴容機制,他會保證capacity的值永遠都是2的冪。

那么,為了保證負載因子(loadFactor) * 容量(capacity)的結果是一個整數,這個值是0.75(3/4)比較合理,因為這個數和任何2的冪乘積結果都是整數。

總結

HashMap是一種K-V結構,為了提升其查詢及插入的速度,底層采用了鏈表的數組這種數據結構實現的。

但是因為在計算元素所在的位置的時候,需要使用hash算法,而HashMap采用的hash算法就是鏈地址法。這種方法有兩個極端。

如果HashMap中哈希沖突概率高,那么HashMap就會退化成鏈表(不是真的退化,而是操作上像是直接操作鏈表),而我們知道,鏈表最大的缺點就是查詢速度比較慢,他需要從表頭開始逐一遍歷。

所以,為了避免HashMap發生大量的哈希沖突,所以需要在適當的時候對其進行擴容。

而擴容的條件是元素個數達到臨界值時。HashMap中臨界值的計算方法:

臨界值(threshold) = 負載因子(loadFactor) * 容量(capacity)

其中負載因子表示一個數組可以達到的最大的滿的程度。這個值不宜太大,也不宜太小。

loadFactor太大,比如等于1,那么就會有很高的哈希沖突的概率,會大大降低查詢速度。

loadFactor太小,比如等于0.5,那么頻繁擴容沒,就會大大浪費空間。

所以,這個值需要介于0.5和1之間。根據數學公式推算。

這個值在log(2)的時候比較合理。

另外,為了提升擴容效率,HashMap的容量(capacity)有一個固定的要求,那就是一定是2的冪。

所以,如果loadFactor是3/4的話,那么和capacity的乘積結果就可以是一個整數。

所以,一般情況下,我們不建議修改loadFactor的值,除非特殊原因。

比如我明確的知道我的Map只存5個kv,并且永遠不會改變,那么可以考慮指定loadFactor。

但是其實我也不建議這樣用。

我們完全可以通過指定capacity達到這樣的目的。

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

 

責任編輯:武曉燕 來源: Hollis
相關推薦

2021-12-02 08:19:06

MVCC面試數據庫

2020-05-20 17:35:40

JavaString面試官

2024-04-10 09:47:59

Java調度虛擬線程

2019-12-25 11:22:19

負載均衡集群算法

2022-04-10 18:10:24

CURD鏈表

2024-08-05 01:26:54

2021-04-01 08:12:20

zookeeper集群源碼

2020-12-01 11:50:49

數據庫Redis面試

2024-09-03 07:58:46

2021-12-06 08:30:49

SpringSpring Bean面試題

2020-12-03 07:39:50

HashMap底層數據

2021-09-29 19:17:51

編碼URLEncodeGBK

2024-09-03 09:20:45

2021-04-14 18:58:01

虛擬機 Java內存

2019-07-15 16:35:43

MySQL索引阿里

2022-04-19 07:31:28

事務隔離機制數據庫

2020-07-02 07:52:11

RedisHash映射

2023-01-03 18:06:42

高并發架構

2021-11-24 10:10:32

axios前端攔截器

2020-10-26 07:07:50

線程安全框架
點贊
收藏

51CTO技術棧公眾號

美女扒开尿口让男人操亚洲视频网站| 欧美日韩国产另类一区| 美女黄毛**国产精品啪啪| 国产免费av一区| 日韩欧美一区免费| 欧美r级电影在线观看| 久久久999免费视频| fc2在线中文字幕| 国产成人aaaa| 国产精品女人网站| 国产精品成人aaaa在线| 精品国产一区探花在线观看 | 国产一二三四区在线观看| 蜜桃视频久久一区免费观看入口| 久久亚洲不卡| 欧美激情乱人伦一区| www.av天天| av成人综合| 欧美日韩国产在线播放网站| 精品国产一区三区| 成人影欧美片| 欧美激情一区二区三区全黄| 国产一区二区三区无遮挡| 中文字幕丰满人伦在线| 一二三区精品| 色在人av网站天堂精品| 成人性生交大片免费看无遮挡aⅴ| 在线一区二区三区视频| 欧美色男人天堂| 男女激情无遮挡| 久久国产精品黑丝| 一区在线中文字幕| 日韩激情视频| 青青草视频在线观看| 成人激情小说网站| 亚洲sss综合天堂久久| 国产乱码在线观看| 久久亚洲风情| 日本精品视频在线播放| 精品成人久久久| 国语自产精品视频在线看8查询8| 深夜福利日韩在线看| 中文字幕 自拍| 台湾色综合娱乐中文网| 亚洲成avwww人| 99精品视频免费版的特色功能| 最新日韩一区| 在线观看日韩高清av| 国产91在线视频观看| 国产精品13p| 天天影视色香欲综合网老头| 日韩精品综合在线| 俄罗斯一级**毛片在线播放| 亚洲一区在线看| www.夜夜爱| 免费毛片在线看片免费丝瓜视频| 亚洲免费高清视频在线| 午夜久久久久久久久久久| 欧美激情办公室videoshd| 国产精品色噜噜| 一本色道久久综合亚洲精品婷婷| 在线观看免费网站黄| 国产精品三级久久久久三级| 一区二区三区久久网| 青青影院在线观看| 最新高清无码专区| 成人av在线播放观看| 女囚岛在线观看| 亚洲mv在线观看| 欧美 日韩 国产在线观看| 欧美日韩在线观看首页| 日本精品一级二级| 亚洲高清免费在线观看| 亚洲欧美一级| 精品国产一区二区精华| 99久久免费看精品国产一区| 亚洲警察之高压线| 在线视频日韩精品| 视频这里只有精品| 精品电影一区| 日本中文字幕不卡免费| 中文字幕a级片| 国产福利一区在线| 久久伦理网站| 日韩欧美小视频| 亚洲最大成人网4388xx| 91九色在线观看视频| 国产一区二区三区朝在线观看| 欧美日韩国产精品自在自线| 欧美午夜精品一区二区| 国产欧美高清视频在线| 欧美成人黄色小视频| 91video| 久久国产日韩欧美精品| 国产精品免费一区二区三区观看 | 免费一级淫片aaa片毛片a级| 天堂av中文在线观看| 欧美日韩色一区| 四虎精品一区二区| 精品久久不卡| 欧美国产日韩xxxxx| 波多野结衣一区二区三区在线 | 日本丶国产丶欧美色综合| 中文字幕亚洲影院| 卡一精品卡二卡三网站乱码| 视频在线观看99| 日韩三级小视频| 极品少妇xxxx精品少妇偷拍| 久久综合久久久| 高h视频在线观看| 色婷婷亚洲综合| 日韩黄色一区二区| 欧美好骚综合网| 亲爱的老师9免费观看全集电视剧| 一区二区视频播放| 99国产精品久久久久| 米仓穗香在线观看| 桃子视频成人app| 精品国产免费人成在线观看| 天堂在线中文视频| 欧美亚洲视频| 国产精品一区二区在线观看| 黄网址在线观看| 在线欧美一区二区| 97人妻天天摸天天爽天天| 91精品1区| 国产精品毛片a∨一区二区三区|国| 蜜臀av免费在线观看| 亚洲欧美另类久久久精品2019| 免费看污污网站| 国产videos久久| 欧美亚洲成人精品| 色香蕉在线视频| 一区二区欧美视频| 日批视频在线看| 午夜精品一区二区三区国产 | 欧美激情在线一区二区三区| 欧美视频在线播放一区| 91欧美极品| 欧美激情精品久久久久久变态| 国产精品福利电影| 国产精品理论在线观看| 欧美午夜aaaaaa免费视频| 国产精品美女久久久久久不卡| 欧美一级片在线播放| 午夜激情在线视频| 精品久久久久久| avtt香蕉久久| 影音先锋中文字幕一区| 国产精品一区二| wwww亚洲| 亚洲国产精品yw在线观看 | 91免费在线| 精品视频色一区| 国产成人免费在线观看视频| 毛片基地黄久久久久久天堂| 亚洲国产另类久久久精品极度| 91福利精品在线观看| 最近2019年日本中文免费字幕 | 免费看一级大片| 国产一区二区视频在线播放| 日韩精品一区二区三区电影| 日韩精品一区二区三区中文| 久久久久久久一区二区三区| 五月婷婷在线播放| 色综合色综合色综合色综合色综合| 一本色道久久综合亚洲精品图片 | 国产精品99导航| 992tv免费直播在线观看| 欧美日韩一区二区在线视频| 三级黄色录像视频| 国产精品一二三区| 99热自拍偷拍| 欧美久久精品一级c片| 成人精品网站在线观看| 中文字幕在线观看网站| 亚洲国产欧美在线成人app | 午夜精品一区二区三级视频| 国产一区二区电影| 久久久性生活视频| 精品成av人一区二区三区| 国产欧美亚洲精品| 毛片网站在线看| 亚洲男人天堂2023| 97超碰国产在线| 午夜精品久久久| 99精品欧美一区二区| 国产乱妇无码大片在线观看| 日韩免费一级视频| 日韩欧美精品| 国产精品综合久久久久久| **在线精品| 久久国产精品久久国产精品| 天堂网在线中文| 欧美人狂配大交3d怪物一区| 日韩三级视频在线播放| 国产精品成人免费精品自在线观看| 性感美女一区二区三区| 免费人成网站在线观看欧美高清| 国产内射老熟女aaaa| 久9久9色综合| 翡翠波斯猫1977年美国| 99re久久| 国内伊人久久久久久网站视频| www 日韩| 亚洲精品视频在线观看视频| 精品毛片一区二区三区| 欧美天天综合网| 日韩xxxxxxxxx| 综合婷婷亚洲小说| 亚洲黄色小说视频| va亚洲va日韩不卡在线观看| 国产福利在线免费| 六月婷婷一区| 欧美图片激情小说| 99热在线成人| 日日骚一区二区网站| 农村少妇一区二区三区四区五区| 成人春色激情网| 欧美精品高清| 2019av中文字幕| 狂野欧美性猛交xxxxx视频| 久久韩剧网电视剧| 黄色小视频在线观看| 亚洲电影成人av99爱色| 99国产精品99| 7777精品伊人久久久大香线蕉| 久久精品久久久久久久| 精品久久久久久久久久久久久| 欧美成人一区二区三区高清| 国产精品欧美综合在线| 麻豆精品免费视频| 99re66热这里只有精品3直播| 日本xxxx免费| 国产精品资源在线观看| 日本精品一区在线| 久久se精品一区二区| 天天操,天天操| 日本少妇一区二区| 爱情岛论坛亚洲首页入口章节| 久久亚洲图片| 亚洲高清在线免费观看| 免费在线亚洲欧美| 成年人视频网站免费观看| 亚洲黄色视屏| 69堂免费视频| 国产欧美激情| 国产日韩一区二区在线观看| 国产欧美精品久久| 北条麻妃在线观看| 久久久精品午夜少妇| 人妻熟女一二三区夜夜爱| 久久精选视频| 日本男人操女人| 青青草国产精品97视觉盛宴| 污视频网站观看| 国产一区二区三区在线观看免费| 国产永久免费网站| 国产精品一二三四区| 免费黄色三级网站| 久久在线观看免费| 快灬快灬一下爽蜜桃在线观看| 中文字幕av不卡| 欧美手机在线观看| 亚洲综合清纯丝袜自拍| 人人干人人干人人干| 欧美小视频在线观看| 黄色一区二区视频| 欧美精品xxxxbbbb| 懂色av蜜臀av粉嫩av分享吧| 欧美精品一区二区三区很污很色的| 天堂在线视频观看| 一区二区三区亚洲| av免费网站在线观看| 性色av香蕉一区二区| **在线精品| 亚洲精品女av网站| 日韩动漫一区| 亚洲一区精彩视频| 亚洲午夜精品久久久久久app| 日本免费黄视频| 麻豆成人久久精品二区三区红 | 激情五月宗合网| 日本伊人精品一区二区三区观看方式| 在线能看的av网站| 成人高清免费观看| 少妇无套高潮一二三区| 亚洲精选免费视频| 日韩精品在线免费视频| 欧美日韩的一区二区| 午夜成人鲁丝片午夜精品| 久久精彩免费视频| 水蜜桃在线视频| 91影院在线免费观看视频| 日韩大胆成人| 神马午夜伦理影院| 日韩成人午夜精品| 无码人妻一区二区三区精品视频| 久久精品人人爽人人爽| 青青草原国产视频| 欧美亚洲日本一区| 姝姝窝人体www聚色窝| 综合国产在线观看| 麻豆理论在线观看| 亚洲aa中文字幕| 综合色就爱涩涩涩综合婷婷| 99视频精品全部免费看| 日韩二区三区四区| 手机在线看片日韩| 亚洲精品一二三| 亚洲国产无线乱码在线观看| 亚洲激情视频网| av在线app| 国产精品一区二区三区成人| 欧美福利在线播放网址导航| 中文字幕中文字幕在线中心一区| 久久综合婷婷| 精品无码在线视频| 亚洲综合色噜噜狠狠| 一本到在线视频| 一区三区二区视频| 625成人欧美午夜电影| 国产免费一区二区三区| 影音先锋日韩精品| 亚洲xxx在线观看| 久久久www免费人成精品| 精品国产乱码一区二区| 精品久久久久久久久久久久久久久 | 久久久蜜臀国产一区二区| 日产精品久久久久久久| 日韩亚洲欧美在线| 好操啊在线观看免费视频| 国产精品丝袜高跟| 国产成人调教视频在线观看 | 日韩高清在线| 欧美一级片免费观看| 日韩亚洲国产精品| 亚洲自拍偷拍精品| 亚洲一级不卡视频| 亚洲精品成人电影| 色综合久久88| 日韩高清二区| 日韩精品一区二区在线视频| 国产精品99久久久久久有的能看| 国产美女福利视频| 欧美精品aⅴ在线视频| 丝袜美腿美女被狂躁在线观看| 国产精品久久久久久久久免费| 国内成人自拍| 国产一级做a爰片久久| 中文字幕av不卡| 一级黄色a毛片| 久久精彩免费视频| 成人动漫视频在线观看| 亚洲色婷婷久久精品av蜜桃| 国产成人av网站| 日韩成年人视频| 精品亚洲aⅴ在线观看| 欧美激情喷水| 亚洲欧洲精品一区| 国产综合久久久久久久久久久久| 日本激情视频一区二区三区| 欧美一区二区三区精品| 51漫画成人app入口| 久久久久久久久四区三区| 日韩中文字幕区一区有砖一区| 日本高清黄色片| 欧美一区二区三区人| 国产色播av在线| 日韩精品欧美一区二区三区| 久久er99热精品一区二区| 久久精品视频9| 亚洲毛片在线免费观看| 国产第一亚洲| 久久久久久久久久伊人| 成人看片黄a免费看在线| 天天干天天色综合| 久久精品青青大伊人av| 国产劲爆久久| 少妇激情一区二区三区| 亚洲激情图片小说视频| 天堂在线免费av| 国产一区二区色| a91a精品视频在线观看| 国产一区二区三区四区在线| 欧美不卡激情三级在线观看| 二区三区不卡| 无码人妻aⅴ一区二区三区日本| 99视频一区二区| 91在线公开视频| 4k岛国日韩精品**专区| 久久精品影视| 无码人妻aⅴ一区二区三区| 欧美日韩激情一区二区| 91九色在线看| 中文字幕日韩精品一区二区| 99re热视频精品| 国产黄色美女视频| 国产精品久久久久久网站| 黄色av成人|