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万!!!