Java-Map:LinkedHashMap

Java LinkedHashMap详解与LRU/LFU实现
本文详细探讨了Java中的LinkedHashMap,解释了其为何优于HashMap的有序性,阐述了其底层数据结构和accessOrder字段的作用。通过accessOrder字段,LinkedHashMap可以实现LRU(最近最少使用)算法。此外,还介绍了LFU(最不经常使用)的实现方式,包括使用LinkedHashMap和自定义HashMap+TreeSet结构。

1.为什么用LinkedHashMap

HashMap 的输出顺序与输入顺序不一致
LinkedHashMap 的输出顺序是有序的

2.LinkedHashMap的底层

LinkedHashMap继承了HashMap,实现了Map接口
LinkedHashMap可以认为是HashMap+LinkedList,
也就是说,它使用HashMap操作数据结构,也用LinkedList维护插入元素的先后顺序。

LinkedHashMap和HashMap的区别在于他们的基本数据机构Entry节点上,它的Entry内部类继承了HashMap的Node类,并且多了两个Entry类型的before,after字段。相当于有了链表的功能。

    static class Entry<K,V> extends HashMap.Node<K,V> {
   
   
        Entry<K,V> before, after;
        Entry(int hash, K key, V value, Node<K,V> next) {
   
   
            super(hash, key, value, next);
        }
    }

3.LinkedHashMap的accessOrder字段

accessOrder = false,插入顺序,put元素的时候会put到链表的尾部
accessOrder = true,访问顺讯,put元素或者访问元素的时候会把当前元素放到链表的尾部,
代表最近访问的元素在尾部,可以用来实现LRU算法。

4. 底层实现

#1 那么LinkedHashMap是如何实现LinkedList的功能的

  1. 首先LinkedHashMap 中有两个字段head,tail字段指向链表的头尾节点,
  2. LinkedHashMap没有重写HashMap的put方法,
    而是重写了HashMap中的newNode()方法,重写后的方法会将新创建的节点插入LinkedList的尾部,

#2 那么LinkedHashMap是如何实现LRU

  1. LinkedHashMap有一个字段accessOrder
    accessOrder = false:LinkedList的节点顺序是插入顺序
    accessOrder = true:LinkedList的节点顺序是访问顺序
  2. HashMap中有三个空方法
    void afterNodeAccess(Node<K,V> p) { }
    void afterNodeInsertion(boolean evict) { }
    void afterNodeRemoval(Node<K,V> p) { }
  3. LinkedHashMap重写了这三个方法
    1)void afterNodeAccess(Node<K,V> p) :如果accessOrder = true,会将访问的节点移动到
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值