Java-Map從入門到性能分析3【LinkedHashMap(性能耗時對比、模擬LRU緩存)、TreeMap(排序、性能對比)】

Map從入門到性能分析https://www.imooc.com/learn/1242【視頻網址】

簡介:Map是開發中,使用頻率最高的知識點之一,Map家族也有很多成員,例如HashMap,LinkedMap等, 怎樣更好的使用Map家族的這些成員,速度效率怎麼更好的得以發揮,大谷老師將自己的一些經驗與大家分享。


筆記01🚀https://blog.csdn.net/weixin_44949135/article/details/106862811【第1、2章】

筆記02🚀https://blog.csdn.net/weixin_44949135/article/details/106867447【第3章】

筆記03🚀https://blog.csdn.net/weixin_44949135/article/details/106871503【第4、5、6章】

目   錄

第4章 LinkedHashMap

4-1 LinkedHashMap性能耗時對比1(12:48)

4-2 LinkedHashMap性能耗時對比2(05:49)

4-3 LinkedHashMap模擬LRU緩存(17:28)

第5章 TreeMap

5-1 TreeMap實現升序或降序(07:51)

1、LinkedHashMap、TreeMap對比

2、升序排列(默認情況)

3、降序排列(定義比較器)

4、案例代碼

5-2 TreeMap等進行性能對比1(09:47)

5-3 TreeMap等進行性能對比2(04:40)

第6章 課程總結

6-1 課程總結(05:32)


第4章 LinkedHashMap

4-1 LinkedHashMap性能耗時對比1(12:48)

HashMap的兄弟:共同實現了Map接口的實現類。

HashMap實現了Map接口;

LinkedHashMap(雙向鏈表形式,對HashMap進行升級)繼承HashMap,也實現了Map接口。

LinkedHashMap錄入數據,耗時比HashMap少!!! 【實驗數據:100萬條記錄。】

 

package com.imooc;

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;

/**
 * 1、分別給HashMap和LinkedHashMap以錄入1百萬數據,並循環遍歷,觀察耗時
 * 2、都採用不帶參的空構造方法
 */
public class TestLinkedHashMap {
    public static void main(String[] args) {
        int count = 1000000;
        Map<String, String> map = new HashMap<String, String>();
        Map<String, String> linkedHashMap = new LinkedHashMap<String, String>();
        Long start, end;

        start = System.currentTimeMillis();
        for (int i = 0; i < count; i++) {
            map.put(String.valueOf(i), "value");
        }
        end = System.currentTimeMillis();
        System.out.println("map time: " + (end - start));

        start = System.currentTimeMillis();
        for (int i = 0; i < count; i++) {
            linkedHashMap.put(String.valueOf(i), "value");
        }
        end = System.currentTimeMillis();
        System.out.println("linkedHashMap time: " + (end - start));

        start = System.currentTimeMillis();
        for (String v : map.values()) {
        }
        end = System.currentTimeMillis();
        System.out.println("map time: " + (end - start));

        start = System.currentTimeMillis();
        for (String v : linkedHashMap.values()) {
        }
        end = System.currentTimeMillis();
        System.out.println("linkedHashMap time: " + (end - start));
    }
}

4-2 LinkedHashMap性能耗時對比2(05:49)

500萬記錄!!!

1000萬條記錄!!!

4-3 LinkedHashMap模擬LRU緩存(17:28)

百度百科:https://baike.baidu.com/item/LRU/1269842?fr=aladdin

 

LRU是Least Recently Used的縮寫,即最近最少使用,是一種常用的頁面置換算法,選擇最近最久未使用的頁面予以淘汰。該算法賦予每個頁面一個訪問字段,用來記錄一個頁面自上次被訪問以來所經歷的時間 t,當須淘汰一個頁面時,選擇現有頁面中其 t 值最大的,即最近最少使用的頁面予以淘汰。【LRU:緩存的計算方法。最近使用的保留;最早使用的清空!】

創建包!

創建類!

package com.imooc;

import com.imooc.common.LRUMap;
import com.sun.org.apache.bcel.internal.generic.NEW;

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;

/**
 * 1、分別給HashMap和LinkedHashMap以錄入1百萬數據,並循環遍歷,觀察耗時
 * 2、都採用不帶參的空構造方法
 */
public class TestLinkedHashMap1 {
    public static void main(String[] args) {

        Map<String, String> linkedHashMap = new LinkedHashMap<String, String>();//雙向鏈表
        linkedHashMap.put("a", "1");
        linkedHashMap.put("b", "2");
        linkedHashMap.put("c", "3");
        linkedHashMap.put("d", "4");
        linkedHashMap.put("e", "5");
        linkedHashMap.get("c");
        System.out.println(linkedHashMap);//1、根據錄入順序進行輸出

        //2、根據使用順序進行輸出【accessOrder:輸出的順序-->採取使用順序】【使用過的鍵值對 排到最後】
        Map<String, String> linkedHashMap2 = new LinkedHashMap<String, String>(16, 0.75f, true);
        linkedHashMap2.put("a", "1");
        linkedHashMap2.put("b", "2");
        linkedHashMap2.put("c", "3");
        linkedHashMap2.put("d", "4");
        linkedHashMap2.put("e", "5");
        linkedHashMap2.get("c");
        linkedHashMap2.get("d");
        System.out.println(linkedHashMap2);

        Map<String, String> LRU = new LRUMap<String, String>(3);//緩存LRU中最多保存3條記錄
        LRU.put("x1", "00");
        LRU.put("x2", "00");
        LRU.put("x3", "00");
        LRU.get("x1");
        LRU.put("x4", "00");
        LRU.put("x5", "00");
        System.out.println(LRU);//只保留最近使用的3個

    }
}
package com.imooc.common;

import java.util.LinkedHashMap;
import java.util.Map;

//<K, V>:K、V是通配符的效果。K、V可以換成String、Integer等,但不具有通配符效果!
public class LRUMap<K, V> extends LinkedHashMap<K, V> {

    private int maxSize;//緩存中保存幾條記錄

    public LRUMap(int maxSize) {
        super(16, 0.75f, true);//按照最近使用的順序進行輸出
        this.maxSize = maxSize;
    }

    //將父類方法按照自定義方式進行重寫,滿足自身業務需要,把先錄入的(使用過的)刪除,只保留最近的內容
    @Override
    protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
//        return super.removeEldestEntry(eldest);
        //size()是LinkedHashMap的方法,返回LinkedHashMap的長度
        //如果長度大於當前自定義輸入的最大長度,將刪除最老的數據(最近沒有使用的數據)
        return size() > this.maxSize;
    }
}
/*

public class LRUMap extends LinkedHashMap {
    private int maxSize;

    public LRUMap(int maxSize) {
        super(16, 0.75f, true);
        this.maxSize = maxSize;
    }

    @Override
    protected boolean removeEldestEntry(Map.Entry eldest) {
//        return super.removeEldestEntry(eldest);
        return size() > this.maxSize;
    }
}

 */

  

第5章 TreeMap

5-1 TreeMap實現升序或降序(07:51)

1、LinkedHashMap、TreeMap對比

TreeMap、LinkedHashMap 都 有序 

LinkedHashMap:按照 輸入 或 訪問 順序,進行顯示。

TreeMap:按 自然數的升序或降序,按照自然數大小進行顯示。

2、升序排列(默認情況)

3、降序排列(定義比較器

降序排列,需要自定義比較器(Comparator),在Comparator中對比較方法[ compare() ]進行定義。

{} --》內部類的方式。加泛型:對 字符類型,進行對比。

4、案例代碼

package com.imooc;

import java.util.Comparator;
import java.util.Map;
import java.util.TreeMap;

/**
 * 默認是按key進行升序排序;如果要按照降序,需要自定義比較器Comparator,
 * 在compare方法中進行定義
 */
public class TestTreeMap {
    public static void main(String[] args) {
        Map<String, String> treeMap = new TreeMap<String, String>(new Comparator<String>() {
            public int compare(String a, String b) {
                return b.compareTo(a);//a>b 返回 正數;  a==b 返回 0;  a<b 返回負數
            }
        });
        treeMap.put("a", "123");
        treeMap.put("b", "123");
        treeMap.put("a", "123");
        treeMap.put("c", "123");
        treeMap.put("ab", "123");
        treeMap.put("eab", "123");
        treeMap.put("eb", "123");
        treeMap.put("eer", "123");
        treeMap.put("1", "123");
        treeMap.put("4", "123");
        treeMap.put("-1", "123");
        treeMap.put("2", "123");
        treeMap.put("9", "123");
        System.out.println(treeMap);

        //構造器的定義,在構造方法的()實現
    }
}

5-2 TreeMap等進行性能對比1(09:47)

通常是將數據庫中的數據取出來,經過Map進行轉存,用於其他地方。

一次性從數據庫中讀100萬條記錄的情況,並不多(極少)。

數據複雜化 --> 進行測試!!!

package com.imooc;

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.TreeMap;

/**
 * 1、分別給HashMap和LinkedHashMap以錄入1百萬數據,並循環遍歷,觀察耗時
 * 2、都採用不帶參的空構造方法
 */
public class TestLinkedHashMap {
    public static void main(String[] args) {
        int count = 10000000;
        Map<String, String> map = new HashMap<String, String>();
        Map<String, String> linkedHashMap = new LinkedHashMap<String, String>();
        Map<String, String> treeMap = new TreeMap<String, String>();
        Long start, end;

        start = System.currentTimeMillis();
        for (int i = 0; i < count; i++) {
            map.put(String.valueOf(i), "value");
        }
        end = System.currentTimeMillis();
        System.out.println("map time: " + (end - start));

        start = System.currentTimeMillis();
        for (int i = 0; i < count; i++) {
            linkedHashMap.put(String.valueOf(i), "value");
        }
        end = System.currentTimeMillis();
        System.out.println("linkedHashMap time: " + (end - start));

        start = System.currentTimeMillis();
        for (int i = 0; i < count; i++) {
            treeMap.put(String.valueOf(i), "value");
        }
        end = System.currentTimeMillis();
        System.out.println("treeMap time: " + (end - start));


        start = System.currentTimeMillis();
        for (String v : map.values()) {
        }
        end = System.currentTimeMillis();
        System.out.println("map time: " + (end - start));

        start = System.currentTimeMillis();
        for (String v : linkedHashMap.values()) {
        }
        end = System.currentTimeMillis();
        System.out.println("linkedHashMap time: " + (end - start));

        start = System.currentTimeMillis();
        for (String v : treeMap.values()) {
        }
        end = System.currentTimeMillis();
        System.out.println("treeMap time: " + (end - start));
    }
}

5-3 TreeMap等進行性能對比2(04:40)

Map必須按照錄入的順序:LinkedHashMap;

Map必須有序(升序、降序):TreeMap。

1000條記錄!!!

1萬條記錄!!!

10萬!!!

50萬!!!

第6章 課程總結

6-1 課程總結(05:32)

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