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類原始碼如下:
執行第2行**的時候,先呼叫父類hashmap類的hashmap()無參建構函式初始化載入因子和閥值,原始碼**如下://這裡就只是多了兩個屬性
private static class entryextends hashmap.entry
//後面源**省略
}
public static void main(string args)
//呼叫無參建構函式
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...