news 2026/11/3 1:22:40

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Java】LinkedHashMap (LRU)淘汰缓存的使用

文章目录

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

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

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


1.initialCapacity(初始容量)

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

示例:

newLinkedHashMap<>(16,0.75f,true);// 初始容量为 16

2.loadFactor(加载因子)

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

示例:

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

3.accessOrder(访问顺序)

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

示例:

newLinkedHashMap<>(16,0.75f,true);// 按访问顺序排序

完整参数解释示例

LinkedHashMap<String,Integer>map=newLinkedHashMap<>(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的效果:

importjava.util.LinkedHashMap;importjava.util.Map;publicclassAccessOrderTest{publicstaticvoidmain(String[]args){Map<String,Integer>map=newLinkedHashMap<>(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 -> A,A被移到链表末尾。
  • 插入D后:B -> C -> A -> D,新键值对始终追加到尾部。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/3 1:20:07

Motif-Video-2B图像到视频转换:从静态图片到动态视频的终极教程

Motif-Video-2B图像到视频转换&#xff1a;从静态图片到动态视频的终极教程 你是否想过将一张普通的静态照片变成生动的动态视频&#xff1f;&#x1f3ac; Motif-Video-2B正是这样一个革命性的AI视频生成工具&#xff0c;它能够将任何图像转化为令人惊叹的动态视频内容。作为…

作者头像 李华
网站建设 2026/11/3 1:19:25

【Hive 运维】JDBC使用Hive UDF:Hive UDF打通hiveserver2

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/3 1:17:40

LTX-LoRAs视频修复实战:从基础到高级的完整教程

LTX-LoRAs视频修复实战&#xff1a;从基础到高级的完整教程 LTX-LoRAs是基于Lightricks/LTX-2.3模型开发的视频修复LoRA集合&#xff0c;提供从基础修复到高级编辑的完整解决方案。本教程将帮助新手快速掌握视频修复技术&#xff0c;通过简单操作实现专业级视频编辑效果。 为什…

作者头像 李华
网站建设 2026/11/3 1:16:14

【python基础】练习题答案【2】

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华