一. 回顧
前面根據源碼分析瞭解LinkedHashMap原理(淺談),現在對LinkedHashMap常見問題進行總結。
本博客僅供自己學習完後總結參考,如有錯誤請指正
二. 常見問題
2.1 LinkedHashMap的原理是怎麼樣的?
2.2 LinkedHashMap有哪兩種有序?
插入順序和訪問順序。是根據成員變量accessOrder
決定的。其訪問順序可以實現LRU。
2.3 如何用LinkedHashMap實現LRU?
繼承LinkedHashMap或構造一個LinkedHashMap並重寫(覆蓋)它的removeEldestEntry(Map.Entry<K,V> eldest)
方法。使LinkedHashMap的長度大於等於緩存閾值的時候,該方法返回true。其底層實現原理見LinkedHashMap原理(淺談)
例子:
@Test
public void test3() {
Map<String, String> map =
new LinkedHashMap<String, String>(5, 0.75f, true) {
@Override
protected boolean removeEldestEntry(Map.Entry<String, String> eldest) {
//當前長度>=5,再插入就移除。即達到閾值時就實現LRU
return this.size()>=5;
}
};
map.put("2", "2");
map.put("1", "1");
map.put("3", "3");
map.put("9", "9");
Set<Map.Entry<String, String>> linkEntries = map.entrySet();//獲取鍵值對集合
System.out.print("訪問前的LinkedHashMap:");
for (Map.Entry<String, String> entry : linkEntries) {
System.out.print(" " + entry + " ");
}
System.out.println();
//訪問linkMap
map.get("2");
System.out.print("訪問2後的LinkedHashMap:");
for (Map.Entry<String, String> entry : linkEntries) {
System.out.print(" " + entry + " ");
}
System.out.println();
map.put("5", "5");
System.out.print("存入5後的LinkedHashMap:");
for (Map.Entry<String, String> entry : linkEntries) {
System.out.print(" " + entry + " ");
}
System.out.println();
}
測試結果: