1. 程式人生 > 實用技巧 >hashmap擴容理解

hashmap擴容理解

在新增元素的時候,如果元素大於等於閘閥,同時即將發生碰撞,hashmap會進行擴容:

擴容的時候,會建立新的table來裝舊table的元素。

方法如下:

void transfer(Entry[] newTable, boolean rehash) {
        int newCapacity = newTable.length;
     //for迴圈中的程式碼,逐個遍歷連結串列,重新計算索引位置,將老陣列資料複製到新陣列中去(陣列不儲存實際資料,所以僅僅是拷貝引用而已)
        for (Entry<K,V> e : table) {
            while
(null != e) { Entry<K,V> next = e.next; if (rehash) { e.hash = null == e.key ? 0 : hash(e.key); } int i = indexFor(e.hash, newCapacity); //將當前entry的next鏈指向新的索引位置,newTable[i]有可能為空,有可能也是個entry鏈,如果是entry鏈,直接在連結串列頭部插入。
e.next = newTable[i]; newTable[i] = e; e = next; } } }

以上內容是從別人文字copy過來的。

下面是我的程式碼流程推演:

tableold【0】進行遍歷,copy到新的table中

第一次遍歷:tableold【0】的連結串列上第一個元素是(key:3,value:A,next:(key:7,value:B)),

通過這個行程式碼:

 e.next = newTable[i];
然後原table的第二個連結串列的第一個元素變成:(key:3,value:A,next:null),然後copy到新的table中
新table【3】變為:
(key:3,value:A,next:null)

對應上面:

第二次遍歷,當前元素是(key:7,value:B,next:(key:5,value:C)),同樣執行程式碼:

e.next = newTable[i];
當前元素(第二個元素),變成(key:7,value:B,next:(key:3,value:A,next:null)),因為第一個元素,和第二個元素獲取下標一樣,
陣列【3】位置變成(key:7,value:B,next:(key:3,value:A,next:null))
對應圖中:

參考:http://m.mamicode.com/info-detail-2120749.html

https://blog.csdn.net/woshimaxiao1/article/details/83661464