java HashMap擴(kuò)容詳解及實(shí)例代碼
HashMap擴(kuò)容
前言:
HashMap的size大于等于(容量*加載因子)的時(shí)候,會(huì)觸發(fā)擴(kuò)容的操作,這個(gè)是個(gè)代價(jià)不小的操作。
為什么要擴(kuò)容呢?HashMap默認(rèn)的容量是16,隨著元素不斷添加到HashMap里,出現(xiàn)hash沖突的機(jī)率就更高,那每個(gè)桶對(duì)應(yīng)的鏈表就會(huì)更長(zhǎng),
這樣會(huì)影響查詢的性能,因?yàn)槊看味夹枰闅v鏈表,比較對(duì)象是否相等,一直到找到元素為止。
為了提升查詢性能,只能擴(kuò)容,減少hash沖突,讓元素的key盡量均勻的分布。
擴(kuò)容基本點(diǎn)
加載因子默認(rèn)值是0.75
static final float DEFAULT_LOAD_FACTOR = 0.75f;
容量的默認(rèn)值是16
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // 等于16
HashMap提供了一個(gè)構(gòu)造參數(shù),可以在創(chuàng)建的時(shí)候指定容量和加載因子。
public HashMap(int initialCapacity, float loadFactor)
默認(rèn)的情況下,HashMap 的size一旦大于等于16*0.75=12的話,
同時(shí)每個(gè)Entry(或者叫桶)里面至少有一個(gè)元素的時(shí)候就會(huì)進(jìn)行擴(kuò)容。
if ((size >= threshold) && (null != table[bucketIndex])) {
resize(2 * table.length);
hash = (null != key) ? hash(key) : 0;
bucketIndex = indexFor(hash, table.length);
}
擴(kuò)容的時(shí)候,容器容量翻倍
resize(2 * table.length);
擴(kuò)容的時(shí)候需要重新計(jì)算元素的數(shù)組下標(biāo)
1、重新分配一個(gè)新的Entry數(shù)組
2、重新計(jì)算原來元素的在新數(shù)組中的下標(biāo)(比較耗資源)
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
Java注解詳解及實(shí)現(xiàn)自定義注解的方法
這篇文章主要介紹了Java注解詳解及實(shí)現(xiàn)自定義注解的方法,本文給大家介紹了jdk中預(yù)定義的一些注解及自定義注解的相關(guān)知識(shí),需要的朋友可以參考下2022-06-06
使用spring boot開發(fā)時(shí)java對(duì)象和Json對(duì)象轉(zhuǎn)換的問題
這篇文章主要介紹了使用spring boot開發(fā)時(shí)java對(duì)象和Json對(duì)象轉(zhuǎn)換的問題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03
Java IO流和文件操作實(shí)現(xiàn)過程解析
這篇文章主要介紹了Java IO流和文件操作實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10
SpringBoot操作MaxComputer方式(保姆級(jí)教程)
這篇文章主要介紹了SpringBoot操作MaxComputer方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-03-03
java日期時(shí)間格式化@JsonFormat與@DateTimeFormat的使用
本文主要介紹了java日期時(shí)間格式化@JsonFormat與@DateTimeFormat的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08
javaweb設(shè)計(jì)中filter粗粒度權(quán)限控制代碼示例
這篇文章主要介紹了javaweb設(shè)計(jì)中filter粗粒度權(quán)限控制代碼示例,小編覺得還是挺不錯(cuò)的,需要的朋友可以參考。2017-10-10
Java運(yùn)用SWT插件編寫桌面記事本應(yīng)用程序
這篇文章主要為大家介紹了一個(gè)Java項(xiàng)目實(shí)戰(zhàn),一步步教你實(shí)現(xiàn)記事本,步驟很詳細(xì),運(yùn)用SWT插件手把手編寫記事本,感興趣的小伙伴們可以參考一下2016-01-01
Java實(shí)現(xiàn)線性表的鏈?zhǔn)酱鎯?chǔ)
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)線性表的鏈?zhǔn)酱鎯?chǔ),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-10-10

