Java-Map从入门到性能分析3【LinkedHashMap(性能耗时对比、模拟LRU缓存)、TreeMap(排序、性能对比)】
【視頻網(wǎng)址】:慕課網(wǎng)——Map從入門到性能分析
簡介:Map是開發(fā)中,使用頻率最高的知識(shí)點(diǎn)之一,Map家族也有很多成員,例如HashMap,LinkedMap等, 怎樣更好地使用Map家族的這些成員,速度效率怎么更好地得以發(fā)揮,我將自己的一些經(jīng)驗(yàn)與大家分享。
- 筆記01🚀【第1、2章】
- 筆記02🚀【第3章】
- 筆記03🚀【第4、5、6章】
工程文件【鏈接:https://pan.baidu.com/s/1Vg3FLVtGeCCKZ3R68Xi2tA【提取碼:zjxs】
目? ?錄
第4章 LinkedHashMap
4-1 LinkedHashMap性能耗時(shí)對(duì)比1(12:48)
4-2 LinkedHashMap性能耗時(shí)對(duì)比2(05:49)
4-3 LinkedHashMap模擬LRU緩存(17:28)
第5章 TreeMap
5-1 TreeMap實(shí)現(xiàn)升序或降序(07:51)
1、LinkedHashMap、TreeMap對(duì)比
2、升序排列(默認(rèn)情況)
3、降序排列(定義比較器)
4、案例代碼
5-2 TreeMap等進(jìn)行性能對(duì)比1(09:47)
5-3 TreeMap等進(jìn)行性能對(duì)比2(04:40)
第6章 課程總結(jié)
6-1 課程總結(jié)(05:32)
第4章 LinkedHashMap
4-1 LinkedHashMap性能耗時(shí)對(duì)比1(12:48)
HashMap的兄弟:共同實(shí)現(xiàn)了Map接口的實(shí)現(xiàn)類。
HashMap實(shí)現(xiàn)了Map接口;
LinkedHashMap(雙向鏈表形式,對(duì)HashMap進(jìn)行升級(jí))繼承HashMap,也實(shí)現(xiàn)了Map接口。
LinkedHashMap錄入數(shù)據(jù),耗時(shí)比HashMap少!!! 【實(shí)驗(yàn)數(shù)據(jù):100萬條記錄。】
?
package com.imooc;import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map;/*** 1、分別給HashMap和LinkedHashMap以錄入1百萬數(shù)據(jù),并循環(huán)遍歷,觀察耗時(shí)* 2、都采用不帶參的空構(gòu)造方法*/ 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性能耗時(shí)對(duì)比2(05:49)
500萬記錄!!!
1000萬條記錄!!!
4-3 LinkedHashMap模擬LRU緩存(17:28)
百度百科:https://baike.baidu.com/item/LRU/1269842?fr=aladdin
?
LRU是Least Recently Used的縮寫,即最近最少使用,是一種常用的頁面置換算法,選擇最近最久未使用的頁面予以淘汰。該算法賦予每個(gè)頁面一個(gè)訪問字段,用來記錄一個(gè)頁面自上次被訪問以來所經(jīng)歷的時(shí)間 t,當(dāng)須淘汰一個(gè)頁面時(shí),選擇現(xiàn)有頁面中其 t 值最大的,即最近最少使用的頁面予以淘汰。【LRU:緩存的計(jì)算方法。最近使用的保留;最早使用的清空!】
創(chuàng)建包!
創(chuàng)建類!
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百萬數(shù)據(jù),并循環(huán)遍歷,觀察耗時(shí)* 2、都采用不帶參的空構(gòu)造方法*/ 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、根據(jù)錄入順序進(jìn)行輸出//2、根據(jù)使用順序進(jìn)行輸出【accessOrder:輸出的順序-->采取使用順序】【使用過的鍵值對(duì) 排到最后】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個(gè)} } 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);//按照最近使用的順序進(jìn)行輸出this.maxSize = maxSize;}//將父類方法按照自定義方式進(jìn)行重寫,滿足自身業(yè)務(wù)需要,把先錄入的(使用過的)刪除,只保留最近的內(nèi)容@Overrideprotected boolean removeEldestEntry(Map.Entry<K, V> eldest) { // return super.removeEldestEntry(eldest);//size()是LinkedHashMap的方法,返回LinkedHashMap的長度//如果長度大于當(dāng)前自定義輸入的最大長度,將刪除最老的數(shù)據(jù)(最近沒有使用的數(shù)據(jù))return size() > this.maxSize;} } /*public class LRUMap extends LinkedHashMap {private int maxSize;public LRUMap(int maxSize) {super(16, 0.75f, true);this.maxSize = maxSize;}@Overrideprotected boolean removeEldestEntry(Map.Entry eldest) { // return super.removeEldestEntry(eldest);return size() > this.maxSize;} }*/??
第5章 TreeMap
5-1 TreeMap實(shí)現(xiàn)升序或降序(07:51)
1、LinkedHashMap、TreeMap對(duì)比
TreeMap、LinkedHashMap 都 有序?!
LinkedHashMap:按照 輸入 或 訪問 順序,進(jìn)行顯示。
TreeMap:按 自然數(shù)的升序或降序,按照自然數(shù)大小進(jìn)行顯示。
2、升序排列(默認(rèn)情況)
3、降序排列(定義比較器)
降序排列,需要自定義比較器(Comparator),在Comparator中對(duì)比較方法[ compare() ]進(jìn)行定義。
{} --》內(nèi)部類的方式。加泛型:對(duì) 字符類型,進(jìn)行對(duì)比。
4、案例代碼
package com.imooc;import java.util.Comparator; import java.util.Map; import java.util.TreeMap;/*** 默認(rèn)是按key進(jìn)行升序排序;如果要按照降序,需要自定義比較器Comparator,* 在compare方法中進(jìn)行定義*/ 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 返回 正數(shù); a==b 返回 0; a<b 返回負(fù)數(shù)}});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);//構(gòu)造器的定義,在構(gòu)造方法的()實(shí)現(xiàn)} }5-2 TreeMap等進(jìn)行性能對(duì)比1(09:47)
通常是將數(shù)據(jù)庫中的數(shù)據(jù)取出來,經(jīng)過Map進(jìn)行轉(zhuǎn)存,用于其他地方。
一次性從數(shù)據(jù)庫中讀100萬條記錄的情況,并不多(極少)。
數(shù)據(jù)復(fù)雜化 --> 進(jìn)行測(cè)試!!!
package com.imooc;import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; import java.util.TreeMap;/*** 1、分別給HashMap和LinkedHashMap以錄入1百萬數(shù)據(jù),并循環(huán)遍歷,觀察耗時(shí)* 2、都采用不帶參的空構(gòu)造方法*/ 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等進(jìn)行性能對(duì)比2(04:40)
Map必須按照錄入的順序:LinkedHashMap;
Map必須有序(升序、降序):TreeMap。
1000條記錄!!!
1萬條記錄!!!
10萬!!!
50萬!!!
第6章 課程總結(jié)
6-1 課程總結(jié)(05:32)
總結(jié)
以上是生活随笔為你收集整理的Java-Map从入门到性能分析3【LinkedHashMap(性能耗时对比、模拟LRU缓存)、TreeMap(排序、性能对比)】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java-Map从入门到性能分析2【Ha
- 下一篇: 前端之旅,正式启航~【前端学习路线图+配