hashmap在使用過程中,資料過多時會自動擴容。那麼,在擴容之前最多可存多少資料呢?
用無參構造方法建立物件:
hashmaphm = new hashmap();
在jdk 7中
addentry方法會先判斷是否需要擴容。
size表示hashmap中已有的鍵值對數量,此時這個值還不包含即將插入新資料。
threshold是擴容閾值。無參構造方法,陣列長度為16,載入因子是0.75,threshold=12。
擴容條件是(size >= threshold) && (null != table[bucketindex]),表示不但要滿足已有鍵值對數量達到擴容閾值,還得確定陣列位置已存在資料,發生hash衝突。反過來說就是,如果陣列位置是空的,即使達到閾值也不會擴容。也就是說,未達到閾值或未發生hash衝突時不擴容
插入資料後,再看一下createentry方法:
鍵值對的數量會自增,size++;但是卻不會重新擴容。
綜上所述,可得出結論:
1、hashmap擴容的必要條件是:必須達到閾值且新增的key在陣列位置發生hash衝突既然會超過閾值,那麼最多可存多少個鍵值對呢?2、新key未發生hash衝突,即使達到閾值,也不會擴容。此時hashmap中鍵值對數量會超過閾值。
擴容之前,閾值不會被k-v數量影響,我們先讓k-v達到閾值12。因為第12個key放入時,map中只有11個key,達不到閾值,不會擴容,所以這第12個key一定可以放入。現在,已經滿足擴容的閾值條件了。要想在不擴容的條件下,放入更多的key,就要使新key不滿足第二個條件,即不要發生hash衝突。只要陣列中有盡可能多的空位,就能放入盡可能多的新key。因為map中已經有資料了,至少會佔據乙個位置,即12個key全部在同乙個位置,那麼就會剩下15個空位。新插入的key都不發生hash衝突的情況下,每個key佔據乙個空位,最多15個。再插入時就會hash衝突了。此時,map中key最多,總共有12+15=27個key
但在jdk8中,put方法呼叫的putval方法,先放入key,再擴容。判斷新增後的size是否達到閾值,超過閾值再擴容。與是否hash衝突無關。所以,jdk8中最多只能存與閾值相同個數key。
1、jdk 7,放入key之前先擴容,放入後不重新判斷是否擴容。達到閾值且hash衝突時才擴容。不發生hash衝突,可超過閾值。最多存個數:threshold+table.length-12、jdk 8,放入key之後再判斷擴容。最多存放key個數與閾值相同
HashMap的擴容問題
hashmap的重要特性是它的容量 capacity 負載因子 load factor 和擴容極限 threshold resizing 當hashmap中的元素個數 陣列大小 乘以 load factor 負載因子預設為0.75 時,陣列就會擴容。hashmap擴容是非常消耗效能的操作,預設元素的...
總結 HashMap的擴容機制
jdk1.7 hashmap擴容原理 原理 建立乙個容量的新陣列,重新計算每個元素在陣列中的位置並且進行遷移。缺點 1 擴容後每個元素需要重新計算hash。2 鍊錶中元素順序 每次遷移後被倒置。jdk1.8 hashmap擴容策略 想法 hashmap是先插入然後再擴容,有的時候我們可能會想如果先增...
HashMap的擴容機制 resize
hashmap底層邏輯 當我們往hashmap中put元素的時候,先根據key的hash值得到這個元素在陣列中的位置 即下標 然後就可以把這個元素放到對應的位置中了。如果這個元素所在的位子上已經存放有其他元素了,那麼在同乙個位子上的元素將以鍊錶的形式存放,新加入的放在鏈頭,最先加入的放在鏈尾。從ha...