LinkedHashMap常見問題LinkedHashMap實現LRU

一. 回顧

前面根據源碼分析瞭解LinkedHashMap原理(淺談),現在對LinkedHashMap常見問題進行總結。

本博客僅供自己學習完後總結參考,如有錯誤請指正

二. 常見問題

2.1 LinkedHashMap的原理是怎麼樣的?

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();
    }

測試結果:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章