日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

hashmap应用场景_Java初学者进阶系列:HashMap的容量与性能

發(fā)布時(shí)間:2025/3/19 java 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hashmap应用场景_Java初学者进阶系列:HashMap的容量与性能 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1. HashMap的容量與性能

HashMap的性能受到兩個(gè)參數(shù)的影響:初始化容量和負(fù)載因子,下面來詳細(xì)講述這幾個(gè)關(guān)鍵問題。

1.1 Initial Capacity與Load Factor

  • Initial Capacity:初始化容量,它表示HashMap底層的那個(gè)數(shù)組,也就是Entry數(shù)組有多長,這個(gè)值默認(rèn)是16。
  • Load Factor:負(fù)載因子,它表示HashMap的負(fù)載程度,換句話說,它表示HashMap到底有多滿了,是不是需要擴(kuò)容了,這個(gè)值默認(rèn)是0.75f。

初始化容量和負(fù)載因子的默認(rèn)值是Java官方經(jīng)過實(shí)踐和優(yōu)化得到的數(shù)據(jù),可以適應(yīng)大多數(shù)的場(chǎng)景。

當(dāng)然也可以不使用其默認(rèn)值,可以在構(gòu)造的時(shí)候,自定義HashMap的容量和負(fù)載因子:

//單純指定容量 Map<String,String> hashMapWithCapacity=new HashMap<>(64); //自定義容量和負(fù)載因子 Map<String,String> hashMapWithCapacityAndLF=new HashMap<>(64, 0.9f);

一旦需要自定義容量和負(fù)載因子,我們需要搞清楚,他們到底是什么,用來干嘛,會(huì)對(duì)性能造成什么影響。

一句話:這兩個(gè)數(shù)值會(huì)影響到HashMap的擴(kuò)容,而擴(kuò)容是一個(gè)對(duì)性能影響非常大的操作。

1.2 HashMap的擴(kuò)容

1.2.1 擴(kuò)容是什么

HashMap的擴(kuò)容:HashMap被初始化之后,其容量是有限的(可以是默認(rèn),也可以是自定義的),當(dāng)元素不斷被插入,是HashMap達(dá)到一定的程度(負(fù)載因子決定),這個(gè)時(shí)候,HashMap就會(huì)擴(kuò)容。

根據(jù)源碼,使用公式表示,是否擴(kuò)容由容量和負(fù)載因子的乘積決定!!!!

觸發(fā)擴(kuò)容的條件: HashMap.Size >= Capacity * LoadFactor
  • HashMap.Size:當(dāng)前HashMap的實(shí)際元素個(gè)數(shù)
  • Capacity:容量
  • LoadFactor:負(fù)載因子

如果在默認(rèn)值的條件下:

HashMap.Size = 16 * 0.75 = 12

也就是,默認(rèn)的情況下,插入十二個(gè)元素的時(shí)候,就會(huì)觸發(fā)擴(kuò)容。

1.2.2 擴(kuò)容的步驟

一旦HashMap的size超過了Capacity * LoadFactor乘積,就會(huì)觸發(fā)擴(kuò)容,那如何擴(kuò)容呢?,需要經(jīng)過兩步:

  • resize:即:創(chuàng)建一個(gè)new Entry數(shù)組,長度是原來old Entry的2倍。
  • rehash:遍歷old Entry數(shù)組,把里面的每一個(gè)元素取出來重新計(jì)算hash和index。為什么要重新計(jì)算呢?想一想之前的index計(jì)算公式:
index = hash值 & (length - 1)

對(duì),因?yàn)殚L度已經(jīng)改了,所以index肯定會(huì)不一樣,舉個(gè)例子:

  • 當(dāng)原數(shù)組長度為16時(shí),Hash運(yùn)算是和1111做與運(yùn)算;
  • 新數(shù)組長度為32,Hash運(yùn)算是和11111做與運(yùn)算。

Hash結(jié)果顯然不同。

1.3 容量與性能(常見問題)

綜上所述,不同的容量和負(fù)載因子的設(shè)置,會(huì)導(dǎo)致hashmap的擴(kuò)容頻率不一致。所以:

  • Initial Capacity設(shè)置得低,存儲(chǔ)空間少,但是增加了rehash的頻率。所以如果能夠預(yù)期到會(huì)存儲(chǔ)比較多的數(shù)據(jù),那么這個(gè)值應(yīng)該設(shè)置高一點(diǎn)
  • Initial Capacity設(shè)置得高,存儲(chǔ)空間多,rehash頻率少。但是會(huì)增加迭代的成本。

所以總結(jié)一個(gè)場(chǎng)景

  • Initial Capacity設(shè)置高:大量存儲(chǔ),少量迭代
  • Initial Capacity設(shè)置低:數(shù)據(jù)少,迭代頻繁

常見問題:

  • 如何擴(kuò)容的
  • 初始化容量是多少,如何設(shè)置,有什么應(yīng)用場(chǎng)景
  • 負(fù)載因子的作用是什么

歡迎大家一起交流!

總結(jié)

以上是生活随笔為你收集整理的hashmap应用场景_Java初学者进阶系列:HashMap的容量与性能的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。