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

文章目录

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

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

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


1. initialCapacity(初始容量)

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

示例

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):节省内存,但会增加冲突概率,影响性能。

示例

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

示例

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

完整参数解释示例

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 的效果:

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.rhkb.cn/news/3585.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络 (41)文件传送协议

前言 一、文件传送协议&#xff08;FTP&#xff09; 概述&#xff1a; FTP&#xff08;File Transfer Protocol&#xff09;是互联网上使用得最广泛的文件传送协议。FTP提供交互式的访问&#xff0c;允许客户指明文件的类型与格式&#xff08;如指明是否使用ASCII码&#xff0…

服务器迁移MySQL

由于公司原有的服务器不再使用&#xff0c;需要将老的服务器上的MySQL迁移到新的服务器上&#xff0c;因此需要对数据进行备份迁移&#xff0c;前提是两台服务器已安装相同版本的MySQL&#xff0c;这里就不再讲解MySQL的安装步骤了&#xff0c;可以安装包、可以在线下载、可以容…

IoTDB 数据类型相关问题

指定数据类型 问题 1 IoTDB 通过 tools/import-data.sh 导入数据时&#xff0c;发现默认推断类型配置没有生效&#xff0c;请问是什么原因&#xff1f; 现象 解决方案 通过 tools/import-data.sh 命令导入数据时&#xff0c;需要指定 -typeInfer 参数&#xff0c;用于指定类…

4.Spring AI Prompt:与大模型进行有效沟通

1.什么是提示词 在人工智能领域&#xff0c;提示词&#xff08;Prompt&#xff09;扮演着至关重要的角色&#xff0c;它宛如一把精准的钥匙&#xff0c;为 AI 大模型开启理解之门。作为向模型输入的关键信息或引导性语句&#xff0c;提示词能够助力模型迅速洞悉问题需求&#…

【12】Word:张老师学术论文❗

目录 题目 ​NO2 NO3 NO4 NO5 NO6 NO7.8 题目 NO2 布局→页面设置→纸张&#xff1a;A4→页边距&#xff1a;上下左右边距→文档网格&#xff1a;只指定行网格→版式&#xff1a;页眉和页脚&#xff1a;页脚距边界&#xff1a;1.4cm居中设置论文页码&#xff1a;插入…

MyBatisPlus学习笔记

To be continue… 文章目录 介绍快速入门入门案例常用注解常用配置 核心功能条件构造器自定义SQLService接口 介绍 MyBatisPlus只做增强不做改变&#xff0c;引入它不会对现有工程产生影响。只需简单配置&#xff0c;即可快速进行单表CRUD操作&#xff0c;从而节省大量时间。…

Python根据图片生成学生excel成绩表

学习笔记&#xff1a; 上完整代码 import os import re from openpyxl import Workbook, load_workbook from openpyxl.drawing.image import Image as ExcelImage from PIL import Image as PilImage# 定义图片路径和Excel文件路径 image_dir ./resources/stupics # 图片所…

DPIN与CESS Network达成全球战略合作,推动DePIN与AI领域创新突破

2025年1月13日, DPIN电竞酒店首次亮相&#xff0c;并于马来西亚马六甲和新加坡成功举办《A*STAR前沿考察盛典》。DPIN基金会透露&#xff0c;过去两个月&#xff0c;DPIN成功验证了去中心化GPU算力的首个应用&#xff0c;证明电竞酒店可成为快速落地的创新场景。 活动期间&…

Red Hat8:搭建FTP服务器

目录 一、匿名FTP访问 1、新建挂载文件 2、挂载 3、关闭防火墙 4、搭建yum源 5、安装VSFTPD 6、 打开配置文件 7、设置配置文件如下几个参数 8、重启vsftpd服务 9、进入图形化界面配置网络 10、查看IP地址 11、安装ftp服务 12、遇到拒绝连接 13、测试 二、本地…

K8S开启/关闭审计日志

K8S默认禁用审计 开启/关闭 k8s 审计日志 默认 Kubernetes 集群不会输出审计日志信息。通过以下配置&#xff0c;可以开启 Kubernetes 的审计日志功能。 准备审计日志的 Policy 文件配置 API 服务器&#xff0c;开启审计日志重启并验证 准备审计日志 Policy 文件 apiVersio…

OpenCV基础:获取子矩阵的几种方式

目录 相关阅读 方法一&#xff1a;使用切片操作 方法二&#xff1a;使用高级索引 方法三&#xff1a;使用条件筛选 方法四&#xff1a;使用 numpy 的 take 函数 相关阅读 OpenCV基础&#xff1a;矩阵的创建、检索与赋值-CSDN博客 OpenCV基础&#xff1a;图像运算-CSDN博客…

深度学习项目--基于LSTM的火灾预测研究(pytorch实现)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 前言 LSTM模型一直是一个很经典的模型&#xff0c;这个模型当然也很复杂&#xff0c;一般需要先学习RNN、GRU模型之后再学&#xff0c;GRU、LSTM的模型讲解将…

计算机网络-物理层

重点内容 物理层的任务几种常用的信道复用技术几种常用的宽带接入技术&#xff0c;重点是FTTx 目录 重点内容 一.物理层的基本概念 二.数据通信基础知识 2.1通信系统模型 2.2信道 2.2.1调制 调制的两大类及其特点 1. 基带调制&#xff08;Baseband Modulation / Coding…

在服务器上增加新网段IP的路由配置

在服务器上增加新网段IP的路由配置 前提条件步骤一:检查当前路由表步骤二:添加新路由步骤三:验证新路由步骤四:持久化路由配置脚本示例结论在网络管理中,路由配置是一项基本且重要的任务。它决定了数据包在网络中的传输路径。本文将详细介绍如何在服务器上增加新的路由配置…

无降智o1 pro——一次特别的ChatGPT专业模式探索

这段时间和朋友们交流 ChatGPT 的使用心得&#xff0c;大家都提到一个很“神秘”的服务&#xff1a;它基于 O1 Pro 模型&#xff0c;能够在对话里一直保持相对高水平的理解和回复&#xff0c;不会突然变得“降智”。同时&#xff0c;整体使用还做了免折腾的网络设置——简单一点…

如何在 Google Cloud Shell 中使用 Visual Studio Code (VS Code)?

Google Cloud Shell 是一个基于浏览器的命令行界面&#xff0c;它提供了一个临时的虚拟机环境&#xff0c;允许开发者在没有本地环境配置的情况下使用 Google Cloud 的各种服务。它还提供了一个免费的 5GB 存储空间以及可以在其中执行所有 Google Cloud 操作的命令行界面。 Vis…

ToDesk设置临时密码和安全密码都可以当做连接密码使用

ToDesk 在各领域办公都已经是非常常见了 为了安全 ToDesk 设置了连接密码&#xff0c;想连接 需要输入远程码和连接密码 我们刚打开 系统默认给我们用的是临时密码&#xff0c;安全性确实很强 和定时Tokey一样&#xff0c;固定时间切换。 但是 如果我们要经常连接这个电脑&a…

语义检索效果差?深度学习rerank VS 统计rerank选哪个

前段时间我开发了一个用白话文搜索语义相近的古诗词的应用&#xff08;详见&#xff1a;《朋友圈装腔指南&#xff1a;如何用向量数据库把大白话变成古诗词》&#xff09;&#xff0c;但是有时候搜索结果却不让人满意&#xff0c;排名靠前的结果和查询的语义没啥关系&#xff0…

vue 学习笔记 - 创建第一个项目 idea

1、安装Vue CLI 查看npm版本号 &#xff08;可跳过&#xff09; % npm -v 11.0.0安装Vue CLI % npm install -g vue/cli2、创建项目 进入工程文件目录 % cd /Users/ruizhifeng/work/aina-client查看vue 版本号 &#xff08;可跳过&#xff09; % vue --version vue/cli 5…

Unity HybridCLR Settings热更设置

需要热更的程序集放到 热更新Assembly Definitions中。 记得补充元数据AOT dlls 打包完成后遇到TypeLoadException: could not load type 时 可能需要在Assets/link.xml中增加对应的设置 <assembly fullname"your assembly" preserve"all"/> link…