資料結構
public class LinkedHashMap<K,V>
extends HashMap<K,V>
implements Map<K,V>
{
transient LinkedHashMap.Entry<K,V> head;
transient LinkedHashMap.Entry<K,V> tail;
// ...
}
LinkedHashMap 繼承了 HashMap ,是在 HashMap 的基礎上,對所有插入的鍵值對維護一個順序。
案例:accessOrder 的解釋
final boolean accessOrder;
首先要對 LinkedHashMap 中的 accessOrder 解釋一下:
依次插入 1,2,3,2
// 當 accessOrder = false 時,輸出
123
// 當 accessOrder = true 時,輸出
132
Process finished with exit code 0
案例完整代碼
@Test
public void test2(){
LinkedHashMap<String,String> map0 = new LinkedHashMap<>(10,0.75f,false);
map0.put("1","1");
map0.put("2","2");
map0.put("3","3");
map0.put("2","2");
System.out.println("當 accessOrder = false 時,輸出");
map.forEach((k,v)-> System.out.printf(k));
System.out.println();
LinkedHashMap<String,String> map = new LinkedHashMap<>(10,0.75f,true);
map.put("1","1");
map.put("2","2");
map.put("3","3");
map.put("2","2");
System.out.println("當 accessOrder = true 時,輸出");
map.forEach((k,v)-> System.out.printf(k));
}
案例:使用 LinkedHashMap 最近最少使用(LRU)的淘汰政策
重寫 removeEldestEntry 方法,定義是否删除“最舊”的鍵值對,再次通路,舊的鍵值對會移到“最新”。
@Test
public void test3(){
// 設定 accessOrder 為 true
MyMap<String,String> map = new MyMap<>(10,0.75f,true);
map.put("1","1");
map.put("2","2");
map.put("3","3");
map.put("4","4");
map.put("5","5");
map.put("2","2");
System.out.println();
// 13452 第二次插入2,2的順序變了
map.forEach((k,v)-> System.out.printf(k));
map.put("6","6");
System.out.println();
//34526 1已被删除
map.forEach((k,v)-> System.out.printf(k));
}
// 繼承 重寫方法
class MyMap<K,V> extends LinkedHashMap<K,V>{
public static final int SIZE = 5;
public MyMap(int initialCapacity, float loadFactor, boolean accessOrder) {
super(initialCapacity, loadFactor, accessOrder);
}
// 重寫 removeEldestEntry 方法
@Override
protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
return size() > 5;
}
}
其他筆記
集合源碼筆記|JDK 1.8
「疑問」Spring,在Controller層,能不能使用 @Transactional?
「案例」Find | Linux 指令