【Java】LinkedHashMap (LRU)淘汰缓存的使用

server/2025/1/18 3:08:42/

文章目录

      • **1. `initialCapacity`(初始容量)**
      • **2. `loadFactor`(加载因子)**
      • **3. `accessOrder`(访问顺序)**
      • **完整参数解释示例**
      • **示例验证**

LinkedHashMap 在 Java 中可维护元素插入或访问顺序,并实现 LRU 缓存,适用于有序存储数据和缓存管理场景。

在 Java 中,LinkedHashMap 的构造函数可以接受三个参数,分别是 initialCapacityloadFactoraccessOrder。以下是具体含义:


1. initialCapacity(初始容量)

  • 含义:指定 LinkedHashMap 的初始容量,也就是可以存储的键值对的数量。
  • 默认值:默认初始容量是 16
  • 工作机制:当存储的键值对数量超过容量的 loadFactor 阈值时,LinkedHashMap 会自动扩容。
  • 设置建议:如果预估可以存储的键值对数量,可以设置为大于等于预估值。否则,系统在达到阈值时会进行扩容,可能影响性能。

示例

java">new LinkedHashMap<>(16, 0.75f, true); // 初始容量为 16

2. loadFactor(加载因子)

  • 含义:定义 LinkedHashMap 的扩容触发条件,计算公式为: 扩容阈值=initialCapacity×loadFactor\text{扩容阈值} = \text{initialCapacity} \times \text{loadFactor}
  • 默认值0.75
  • 工作机制:当存储的键值对数量超过扩容阈值时,LinkedHashMap 会将容量增加一倍(重新哈希)。
  • 设置建议
    • 较低的加载因子(如 0.5):减少冲突,但会增加内存占用。
    • 较高的加载因子(如 1.0):节省内存,但会增加冲突概率,影响性能。

示例

java">new LinkedHashMap<>(16, 0.75f, true); // 加载因子为 0.75,扩容阈值为 16 × 0.75 = 12

3. accessOrder(访问顺序)

  • 含义:定义键值对的迭代顺序:
    • false(默认值):按照插入顺序排序(插入顺序)。
    • true:按照访问顺序排序(最近访问的在后面)。
  • 工作机制:如果 accessOrder 设置为 true,每次访问(包括 getput 操作)会将该键值对移动到双向链表的尾部,从而保证最近访问的元素总是位于链表末尾。
  • 使用场景
    • 如果需要实现 LRU 缓存(Least Recently Used),设置 accessOrder = true
    • 如果不需要按访问顺序排序,可以省略该参数或设置为 false

示例

java">new LinkedHashMap<>(16, 0.75f, true); // 按访问顺序排序

完整参数解释示例

java">LinkedHashMap<String, Integer> map = new LinkedHashMap<>(16, 0.75f, true);
  1. initialCapacity = 16:初始可以存储最多 16 个键值对。
  2. loadFactor = 0.75f:扩容阈值为 16×0.75=1216 \times 0.75 = 12,当存储键值对超过 12 时触发扩容。
  3. accessOrder = true:按访问顺序排序,最近访问的键值对会移动到链表末尾。

示例验证

以下代码展示了 accessOrder = true 的效果:

java">import java.util.LinkedHashMap;
import java.util.Map;public class AccessOrderTest {public static void main(String[] args) {Map<String, Integer> map = new LinkedHashMap<>(16, 0.75f, true);map.put("A", 1);map.put("B", 2);map.put("C", 3);System.out.println("Initial: " + map);// 访问 "A"map.get("A");System.out.println("After accessing A: " + map);// 插入新元素 "D"map.put("D", 4);System.out.println("After inserting D: " + map);}
}

输出结果

Initial: {A=1, B=2, C=3}
After accessing A: {B=2, C=3, A=1}
After inserting D: {B=2, C=3, A=1, D=4}

解释

  • 初始状态:A -> B -> C,按照插入顺序。
  • 访问 A 后:B -> C -> AA 被移到链表末尾。
  • 插入 D 后:B -> C -> A -> D,新键值对始终追加到尾部。


http://www.ppmy.cn/server/159245.html

相关文章

微软震撼发布:Phi-4语言模型登陆Hugging Face

近日&#xff0c;微软公司在Hugging Face平台上正式发布了其最新的语言模型Phi-4&#xff0c;这一发布标志着人工智能技术的又一重要进步。Phi-4模型以其140亿参数的高效配置&#xff0c;在复杂推理任务中表现出色&#xff0c;特别是在数学领域&#xff0c;更是展现出了卓越的能…

MetaPhlAn2-增强版宏基因组分类谱工具-一条命令获得宏基因组物种组成

MetaPhlAn2是分析微生物群落(细菌、古菌、真核生物和病毒)组成的工具&#xff0c;它在宏基因组研究中非常有用&#xff0c;只需一条完命令即可获得微生物的物种丰度信息(扩增子物种组成需要质控、拼接、拆样本、切除引物、比对等步骤&#xff0c;此软件居然分析宏基因组这么方便…

御载 MATLAB

御载matlab 要彻底删除 MATLAB&#xff0c;可以按照以下步骤进行操作&#xff1a; 关闭 MATLAB 和相关程序 确保 MATLAB 及其所有相关程序和窗口都已关闭。 卸载 MATLAB 通过控制面板中的“程序和功能”或在 MATLAB 安装文件夹中找到 uninstall.exe 程序进行卸载。 控制面…

ESP32-C3物联网芯片方案,设备智能化交互联动,无线通信控制技术

在科技的浩瀚星空中&#xff0c;物联网芯片犹如一颗璀璨的明星&#xff0c;正散发着耀眼的光芒。它以其独特的魅力和强大的功能&#xff0c;吸引着无数科技爱好者和行业的目光。 在当今数字化浪潮席卷的时代&#xff0c;物联网技术正在不断的改变着我们的生活与生产方式&#…

Linux网络知识——路由表

路由表 1 定义与作用 Linux路由表是一个内核数据结构&#xff0c;用于描述Linux主机与其他网络设备之间的路径&#xff0c;以及如何将数据包从源地址路由到目标地址。路由表的主要作用是指导数据包在网络中的传输路径&#xff0c;确保数据包能够准确、高效地到达目标地址。 …

【新教程】Ubuntu 24.04 单节点安装slurm

背景 网上教程老旧&#xff0c;不适用。 详细步骤 1、安装slurm sudo apt install slurm-wlm slurm-wlm-doc -y检查是否安装成功&#xff1a; slurmd --version如果得到slurm-wlm 23.11.4&#xff0c;表明安装成功。 2、配置slurm。 使用命令&#xff1a; sudo vi /etc/s…

如何通过 Nginx 实现 CouchDB 集群的负载均衡并监控请求分发

在现代分布式系统中&#xff0c;负载均衡是确保高可用性和性能的关键组件。CouchDB 是一个强大的分布式数据库&#xff0c;而 Nginx 是一个高性能的反向代理和负载均衡器。本文将详细介绍如何通过 Nginx 实现 CouchDB 集群的负载均衡&#xff0c;并监控请求被分发到哪一台 Couc…

踏上 C++ 编程之旅:开篇之作

踏上 C 编程之旅&#xff1a;开篇之作 在计算机编程的广袤天地中&#xff0c;C 宛如一座巍峨的高峰&#xff0c;吸引着无数开发者攀登探索。今天&#xff0c;就让我们一同开启这段充满挑战与惊喜的 C 编程之旅&#xff0c;在代码的世界里开辟属于自己的道路。 一、为什么选择…