LinkedHashMap 原始碼分析

2021-09-01 08:38:44 字數 2854 閱讀 3230

map 介面的雜湊表和鏈結列表實現,具有可預知的迭代順序。此實現與 hashmap 的不同之處在於,後者維護著乙個執行於所有條目的雙重鏈結列表。此鏈結列表定義了迭代順序,該迭代順序通常就是將鍵插入到對映中的順序(插入順序)或者是從近期訪問最少到近期訪問最多的順序(訪問順序)。

linkedhashmap效能很可能比 hashmap 稍遜一籌,不過這一點例外:linkedhashmap 的 collection 檢視迭代所需時間與對映的大小 成比例。hashmap 迭代時間很可能開支較大,因為它所需要的時間與其容量 成比例。

linkedhashmap不是執行緒安全的。在按插入順序鏈結的雜湊對映中,僅更改與對映中已包含鍵關聯的值不是結構修改。在按訪問順序鏈結的雜湊對映中,僅利用 get 查詢對映是結構修改。

public class linkedhashmap

extends hashmap

implements map

// 構造乙個帶指定初始容量和預設載入因子 (0.75) 的空插入順序 linkedhashmap 例項。

public linkedhashmap(int initialcapacity)

// 構造乙個帶預設初始容量 (16) 和載入因子 (0.75) 的空插入順序 linkedhashmap 例項。

public linkedhashmap()

// 構造乙個對映關係與指定對映相同的插入順序 linkedhashmap 例項。所建立的 linkedhashmap 例項具有預設的載入因子 (0.75) 和足以容納指定對映中對映關係的初始容量。

public linkedhashmap(map<? extends k, ? extends v> m)

// 構造乙個帶指定初始容量、載入因子和排序模式的空 linkedhashmap 例項。

public linkedhashmap(int initialcapacity,

float loadfactor,

boolean accessorder)

// 例項化時由父類呼叫該方法,初始化header,前後節點指向自己。

void init()

// 把所有的鍵值對遷移到新的陣列中。該方法由父類的resize方法呼叫。重寫該方法以提公升效能,使用雙向鍊錶迭代會快些。

void transfer(hashmap.entry newtable)

}// 如果此對映將乙個或多個鍵對映到指定值,則返回 true。

public boolean containsvalue(object value) else

return false;

}// 返回此對映到指定鍵的值。如果此對映中沒有該鍵的對映關係,則返回 null 。

// 更確切地講,如果此對映包含滿足 (key==null ? k==null : key.equals(k)) 的從鍵 k 到值 v 的對映關係,則此方法返回 v;否則,返回 null。(最多只能有乙個這樣的對映關係。)

// 返回 null 值並不 一定 表明此對映不包含該鍵的對映關係;也可能此對映將該鍵顯式地對映為 null。可使用 containskey 操作來區分這兩種情況。

public v get(object key)

// 從該對映中移除所有對映關係。此呼叫返回後對映將為空。

public void clear()

// 鍵值對類

private static class entryextends hashmap.entry

// 從該雙向鍊錶中移除該節點

private void remove()

// 在存在的某個節點之前加入該節點

private void addbefore(entryexistingentry)

// 不管哪個節點被讀取或修改,父類都會呼叫該方法。如果該linkedhashmap是訪問順序的,則將節點加到末尾,否則不做任何操作。

void recordaccess(hashmapm)

}// 記錄刪除事件

void recordremoval(hashmapm)

}// 迭代器抽象類

private abstract class linkedha****eratorimplements iterator

public void remove()

entrynextentry()

}// 鍵迭代器

private class keyiterator extends linkedha****erator

}// 值迭代器

private class valueiterator extends linkedha****erator

}// 鍵值對迭代器

private class entryiterator extends linkedha****erator>

}iteratornewkeyiterator()

iteratornewvalueiterator()

iterator> newentryiterator()

// 新增鍵值對到鍊錶的尾部並且根據情況移除最先節點

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

}// 新增鍵值對。和addentry類似,區別是少了移除最先節點和增大鍵值對陣列

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

// 是否移除最先節點。在快取實現中有用。子類可以重寫該方法。

protected boolean removeeldestentry(map.entryeldest)

}

AbstractCollection原始碼分析

abstractcollection抽象類提供了collection的骨架實現,collection分析請看 這裡直接看它的 是如何實現的.public abstract iterator iterator 該方法沒有實現.public abstract int size 該方法沒有實現.publi...

ThreadPoolExecutor原始碼閱讀

執行緒池解決兩個問題 一是復用執行緒,減少建立銷毀執行緒帶來系統開銷 二是限定系統資源使用邊界,避免大量執行緒消耗盡系統記憶體 適用於互不依賴,執行時間短,不需要對執行緒控制操作的執行緒 新增任務時,1.若執行緒數量小於corepoolsize,則新增執行緒執行任務 2.若執行緒數量大於等於core...

OrangePi One Android 原始碼編譯

一 系統環境搭建參照 二 lichee原始碼編譯 1.檢視help build.sh h2.配置核心 cd linux 3.4 make arch arm menuconfig 進入配置頁面,上下移動列表,空格是選擇列表,左右移動選擇退出選項 3.首次編譯執行清除 在 lichee linux3.4...