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...