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)

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