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-1 LinkedHashMap性能耗時對比1(12:48)
4-2 LinkedHashMap性能耗時對比2(05:49)
4-3 LinkedHashMap模擬LRU緩存(17:28)
第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萬!!!