Java原始碼集合類LinkedHashMap學習1

2021-07-28 08:56:40 字數 2881 閱讀 5365

linkedhashmap類簡介(jdk 1.7.0_67)

linkedhashmap類繼承了hashmap類,也就是linkedhashmap類的功能幾乎和hashmap一樣。而linkedhashmap類就是擴充套件了乙個雙向鍊錶,使得可以按照「鍵-值」對插入的順序遍歷,這個是在hashmap類中遍歷是沒有順序的。linkedhashmap類可以插入null的key值和value值,以及這個類也是執行緒不安全的。重點是要了解它是如何實現按「鍵-值」對插入的順序遍歷的。

public class linkedhashmapextends hashmapimplements map
linkedhashmap類中的entry類繼承自hashmap.entry類原始碼如下:

//這裡就只是多了兩個屬性

private static class entryextends hashmap.entry

//後面源**省略

}public static void main(string args)

執行第2行**的時候,先呼叫父類hashmap類的hashmap()無參建構函式初始化載入因子和閥值,原始碼**如下:

//呼叫無參建構函式

public hashmap()

public hashmap(int initialcapacity, float loadfactor)

//linkedhashmap類中的init()方法

接著執行**:linkedmap.put("k1", "v1"),linkedhashmap類中並沒有重寫這個方法,它呼叫的是父類hashmap類中的put(k k, v v)方法,原始碼如下:

public v put(k key, v value)

if (key == null)

return putfornullkey(value);

int hash = hash(key);

int i = indexfor(hash, table.length);

for (entrye = table[i]; e != null; e = e.next)

} modcount++;

addentry(hash, key, value, i);//此處呼叫的是linkedhashmap類中的該方法,因為重寫了該方法(體現了多型性)

return null;

}

put方法中要做的事就是初始化table陣列的容量,計算雜湊值,根據雜湊值算出在table陣列中的索引,然後在是儲存「鍵-值」對。關鍵是看看linkedhashmap類中方法addentry()的原始碼:

void addentry(int hash, k key, v value, int bucketindex) 

}protected boolean removeeldestentry(map.entryeldest)

這行**:super.addentry(hash, key, value, bucketindex)它是呼叫了父類hashmap中的方法,源**如下:

void addentry(int hash, k key, v value, int bucketindex) 

createentry(hash, key, value, bucketindex);//此處呼叫的是linkedhashmap類中的該方法,因為重寫了該方法(體現了多型性)

}//linkedhashmap中的方法

void createentry(int hash, k key, v value, int bucketindex)

//linkedhashmap中的方法

private void addbefore(entry

existingentry)

從上面的原始碼可以看出,父類中hashmap維護了「鍵-值」對的基本儲存結構,也就是說」鍵—值「對儲存在hashmap類中的結構一樣。而重點我們就來分析linkedhashmap類中它是如何建立雙向鍊錶的。通過上面main方法中的put**和方法addbefore(entry existingentry)方法來分析。

**:linkedmap.put("k1", "v1");假設生成entry<>物件的位址是:0x001,根據key="k1"計算出的hash值是3214,next為null。分析忽略了具體在table陣列中的位置,只分析如何建立雙向鍊錶的過程,當執行到e.addbefore(header),它的記憶體指向圖如下所示:

1.after  = existingentry,existingentry它在這裡始終是鍊錶的頭header,after變數指向的位址是header的位址0x000;

**linkedmap.put("k2", "v2")(假設生成的entry<>物件為e2,記憶體位址為0x002,hash值為1243,next=null)執行的結果,組成的雙向鍊錶如下圖:

每次put進來乙個新的」鍵—值「對就生成乙個entry<>物件插入到鍊錶header的前面組成乙個前後雙向的鍊錶,這個就是linkedhashmap類的關鍵點,這樣我們就可以按照插入的順序遍歷」鍵—值「對元素了。這裡用到了資料結構鍊錶的知識,當我們對未知感到恐懼,是因為我們無知。

Java集合 ArrayList原始碼

一 arraylist資料結構 arraylist底層是陣列實現的,陣列元素的型別是object型別,可以動態的增長和縮減。arraylist先繼承abstractlist,abstractlist實現list介面 二 arraylist的屬性 版本號 private static final lo...

集合類原始碼解讀

1 transient node table 2 static class nodeimplements map.entry final int hash final k key v value nodenext hashmap是個鍊錶結構的陣列,陣列既是1處的 乙個node型別的成員變數名為tab...

java集合相關原始碼分析

hashmap 原始碼分析 hashset 原始碼分析 arraylist 原始碼分析 concurrentmap 原始碼分析 2018 03 25 map 綜述 一 徹頭徹尾理解 hashmap map 綜述 二 徹頭徹尾理解 linkedhashmap map 綜述 三 徹頭徹尾理解 concu...