LinkedHashMap的简单理解,以及实现lru缓存

简单来说,LinkedHashMap是Map接口的哈希表和链接列表实现,具有可预知的迭代顺序,可以理解为 linkedlist + hashmap的组合

根据链表中元素的顺序可以分为:按插入顺序的链表,和按访问顺序(调用get方法)的链表。默认是按插入顺序排序,如果指定按访问顺序排序,那么调用get方法后,会将这次访问的元素移至链表尾部,不断访问可以形成按访问顺序排序的链表。 可以重写removeEldestEntry方法返回true值指定插入元素时移除最老的元素。

构造方法:

LinkedHashMap() 
          构造一个带默认初始容量 (16) 和加载因子 (0.75) 的空插入顺序 LinkedHashMap 实例。 
LinkedHashMap(int initialCapacity) 
          构造一个带指定初始容量和默认加载因子 (0.75) 的空插入顺序 LinkedHashMap 实例。 
LinkedHashMap(int initialCapacity, float loadFactor) 
          构造一个带指定初始容量和加载因子的空插入顺序 LinkedHashMap 实例。 
LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder) 
          构造一个带指定初始容量、加载因子和排序模式的空 LinkedHashMap 实例。 
LinkedHashMap(Map<? extends K,? extends V> m) 
          构造一个映射关系与指定映射相同的插入顺序 LinkedHashMap 实例。 

initialCapacity:初始容量(指定LinkedHashMap实例的初始容量,默认16);
loadFactor:加载因子(当执行一次put操作后,如果发现LinkedHashMap容量超出初始容量,将自动进行扩容,扩容大小为initialCapacity*loadFactor,默认0.75);
accessOrder:排序模式(true为按访问顺序,false为按插入顺序排序,默认false);

与hashmap的比较

LinkedHashMap是否允许空Key和Value都允许空
LinkedHashMap是否允许重复数据Key重复会覆盖、Value允许重复
LinkedHashMap是否有序有序
LinkedHashMap是否线程安全非线程安全

get方法

public V get(Object key) {
        Node<K,V> e;
        if ((e = getNode(hash(key), key)) == null)
            return null;
        if (accessOrder)
            afterNodeAccess(e);
        return e.value;
    }

get方法被重写,afterNodeAccess(e),执行这个方法后,把最后一次访问的数据移动到链表尾,从新排序,

当排序模式为访问顺序时,accessOrder为true,当对已存在LinkedHashMap中的Entry进行get和put操作时,会把Entry移动到双向链表的表尾(其实是先删除,再插入)

利用LinkedHashMap实现lru算法:

constructionProjectDtoMap = new LinkedHashMap(10,0.75f,true){

                private static final int MAX_ENTRIES = 10;

                protected boolean removeEldestEntry(Map.Entry eldest) {
                    return size() > MAX_ENTRIES;
                }
            };

在构造方法后,重写removeEldestEntry方法,当容量大于设定值后,返回true,删除过期数据。但有很坑的地方就是,LinkedHashMap不是线程安全的,所以在使用过程中,需要加锁或者使用同步代码块儿

参考文章:
https://www.cnblogs.com/whoislcj/p/5552421.html
https://www.cnblogs.com/xiaoxi/p/6170590.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值