天天看點

LinkedHashMap 筆記|JDK1.8

作者:java筆記

資料結構

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 指令

繼續閱讀