LinkedHashMap使用

说明:本文介绍 Java 中 LinkedHashMap 的使用。

与 HashMap 的区别

LinkedHashMap,是 HashMap 的子类,是在 HashMap 的基础上维护了双向链表。

这就让 LinkedHashMap 中的元素能保持有序,按元素插入的顺序。

使用

在实际的使用中,双列集合,除了需要元素保持有序,我们可以使用 LinkedHashMap。

LinkedHashMap 还能当作最近最少使用(LRU)的缓存容器来使用,如下:

java 复制代码
import java.util.LinkedHashMap;
import java.util.Map;

/**
 * 最近最少使用(LRU)的缓存容器
 */
public class LinkedHashMapCache extends LinkedHashMap<String, Object> {

    /**
     * 缓存最大容量
     */
    private final int maxCapacity;

    public LinkedHashMapCache(int maxCapacity) {
        super(maxCapacity, 0.75f, true);
        this.maxCapacity = maxCapacity;
    }

    /**
     * 超出最大容量,移除最近最少使用的元素
     * 最近最少使用的标准:最近未被访问的元素
     */
    @Override
    protected boolean removeEldestEntry(Map.Entry<String, Object> eldest) {
        return size() > maxCapacity;
    }
}

使用,存满容器后再存入一个元素,查看容器内的元素情况

java 复制代码
public class LinkedHashMapDemo {
    public static void main(String[] args) {
        LinkedHashMapCache linkedHashMapCache = new LinkedHashMapCache(6);
        linkedHashMapCache.put("1", "a");
        linkedHashMapCache.put("2", "b");
        linkedHashMapCache.put("3", 1);
        linkedHashMapCache.put("4", "d");
        linkedHashMapCache.put("5", "e");
        linkedHashMapCache.put("6", "f");
        System.out.println("init:" + linkedHashMapCache);

        linkedHashMapCache.get("1");
        linkedHashMapCache.get("2");
        linkedHashMapCache.put("3", Integer.parseInt(linkedHashMapCache.get("3").toString()) + 1);
        linkedHashMapCache.put("7", "g");
        System.out.println("used:" + linkedHashMapCache);
    }
}

以下结论:

  • 存入的元素有序,开始按元素插入顺序,元素被访问后移到末尾;

  • 容器存满后,再存入一个元素,放到容器末尾,删除首位元素;

基于 LinkedHashMap 以上特性,可以作为一个最近最少访问(LRU)的缓存容器使用。

实际场景,如系统中需要体现最近系统活跃的十个用户信息,就可以用 LinkedHashMap。

(当然,存对象,需要重写 equals 和 hashCode 方法,或者也可以存用户 ID,展示时再用这些 ID 集合查数据库的用户信息)

相关推荐
陈随易6 小时前
在 VSCode 里,把项目一键部署到服务器
前端·后端·程序员
鱼樱前端7 小时前
我用 Claude Code 后,编码效率翻 3 倍。但更值钱的是别的。
前端·后端·ai编程
犀利豆7 小时前
Claude code tools 研究系列-开篇(AskUserQuestion)
后端
头发还在的女程序员8 小时前
医院陪诊管理系统怎么选择?——2026 年选型避坑与架构参考
java·开发语言·陪诊系统·陪诊app·医院陪诊陪护
CodeStats8 小时前
【Spring事务】Spring事务注解 @Transactional 完整体系:从 MySQL 隔离级别到 MyBatis 原理详解
java·spring·mybatis·事务·transactional
我命由我123459 小时前
Android 开发问题:为 PDFView 设置一个带有黑色边框的背景 drawable,但边框没有生效
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
颜酱10 小时前
06 | 把 meta_config 同步进 MySQL(生成阶段)
前端·人工智能·后端
都叫我大帅哥11 小时前
从Python到Java:为什么企业级Agent最终会选择Java?
java·ai编程
wanderist.11 小时前
Lambda表达式在算法竞赛中的应用
java·开发语言·算法
IT_陈寒11 小时前
SpringBoot自动配置坑了我一周,原来问题这么蠢!
前端·人工智能·后端