java HashMap擴(kuò)容詳解及實(shí)例代碼
HashMap擴(kuò)容
前言:
HashMap的size大于等于(容量*加載因子)的時(shí)候,會觸發(fā)擴(kuò)容的操作,這個是個代價(jià)不小的操作。
為什么要擴(kuò)容呢?HashMap默認(rèn)的容量是16,隨著元素不斷添加到HashMap里,出現(xiàn)hash沖突的機(jī)率就更高,那每個桶對應(yīng)的鏈表就會更長,
這樣會影響查詢的性能,因?yàn)槊看味夹枰闅v鏈表,比較對象是否相等,一直到找到元素為止。
為了提升查詢性能,只能擴(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òu)造參數(shù),可以在創(chuàng)建的時(shí)候指定容量和加載因子。
public HashMap(int initialCapacity, float loadFactor)
默認(rèn)的情況下,HashMap 的size一旦大于等于16*0.75=12的話,
同時(shí)每個Entry(或者叫桶)里面至少有一個元素的時(shí)候就會進(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、重新分配一個新的Entry數(shù)組
2、重新計(jì)算原來元素的在新數(shù)組中的下標(biāo)(比較耗資源)
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
SpringBoot項(xiàng)目中feignClient使用方式
文章介紹了在Spring Boot項(xiàng)目中配置Feign客戶端攔截器的具體步驟,包括在application.yml中添加配置、在主類上啟用組件掃描、將攔截器加入到攔截器列表中以及在接口調(diào)用時(shí)的說明,總結(jié)指出這是個人經(jīng)驗(yàn)分享,希望對大家有所幫助2024-11-11關(guān)于Selenium的UI自動化測試屏幕截圖功能實(shí)例代碼
今天小編就為大家分享一篇關(guān)于Selenium的UI自動化測試屏幕截圖功能實(shí)例代碼,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05