LinkedHashMap基本用法&使用实现简单缓存

LinkedHashMap——读书笔记

《Java编程的逻辑》读书笔记

1. 基本用法

LinkedHashMap是HashMap的子类,但是内部还有一个双向链表维护键值对的顺序,每个键值对既位于哈希表中,也位于双向链表中。LinkedHashMap支持两种顺序插入顺序 、 访问顺序

  1. 插入顺序:先添加的在前面,后添加的在后面。修改操作不影响顺序
  2. 访问顺序:所谓访问指的是get/put操作,对一个键执行get/put操作后,其对应的键值对会移动到链表末尾,所以最末尾的是最近访问的,最开始的是最久没有被访问的,这就是访问顺序。

1.1 指定按照访问顺序排序

LinkedHashMap有5个构造方法,其中4个都是按插入顺序,只有一个是可以指定按访问顺序:

public LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder)

其中参数accessOrder就是用来指定是否按访问顺序,如果为true,就是访问顺序。

1.2 栗子

默认情况下,LinkedHashMap是按照插入顺序的,我们举个栗子:

Map<String, Integer> seqMap = new LinkedHashMap<>();
seqMap.put("c",100);
seqMap.put("d",200);
seqMap.put("a",500);
seqMap.put("d",300);
for(Entry<String,Integer> entry:seqMap.entrySet()){
	System.out.println(entry.getKey()+" "+entry.getValue());
}

键是按照:“c”, “d”,"a"的顺序插入的,修改d不会修改顺序,输出为:

c 100
d 300
a 500

按访问顺序的栗子:

Map<String, Integer> accessMap = new LinkedHashMap<>(16,0.75f,true);
accessMap.put("c",100);
accessMap.put("d",200);
accessMap.put("a",500);
accessMap.get("c");
accessMap.put("d",300);
for(Map.Entry<String,Integer> entry:accessMap.entrySet()){
    System.out.println(entry.getKey()+" "+entry.getValue());
}

输出为:

a 500
c 100
d 300

1.3 使用按访问有序实现缓存

import java.util.LinkedHashMap;
import java.util.Map;

public class LRUCache<K, V> extends LinkedHashMap<K, V> {

    private int maxEntries;

    public LRUCache(int maxEntries) {
        super(16, 0.75f, true);
        this.maxEntries = maxEntries;
    }

    @Override
    protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
        return size() > maxEntries;
    }

}

在LinkedHashMap添加元素后,会调用removeEldestEntry防范,传递的参数时最久没有被访问的键值对,如果方法返回true,这个最久的键值对就会被删除。LinkedHashMap中的实现总返回false,该子类重写后即可实现对容量的控制

使用该缓存:

        LRUCache<String,Object> cache = new LRUCache<>(3);
        cache.put("a","abstract");
        cache.put("b","basic");
        cache.put("c","call");
        cache.get("a");
        cache.put("d","滴滴滴");
        System.out.println(cache); // 输出为:{c=call, a=abstract, d=滴滴滴}
  • 36
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: LinkedHashMap是一种特殊的HashMap,它在HashMap的基础上添加了按照插入顺序或访问顺序进行排序的功能。LinkedHashMap的底层原理是通过维护一个双向链表来实现元素的顺序。\[1\]当元素被插入LinkedHashMap时,它会被添加到链表的尾部;当元素被访问时,它会被移动到链表的尾部。这样一来,我们可以通过遍历链表来按照插入顺序或访问顺序获取元素。\[2\]LinkedHashMap使用与HashMap基本一致,但是它提供了额外的构造函数和方法来支持按照插入顺序或访问顺序进行操作。\[3\]总的来说,LinkedHashMap是一种非常有用的数据结构,可以用于实现LRU算法缓存等场景。 #### 引用[.reference_title] - *1* [LinkedHashMap底层原理](https://blog.csdn.net/mccand1234/article/details/115266982)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [LinkedHashMap原理和底层实现](https://blog.csdn.net/qq_45839663/article/details/127691432)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值