java系列-LinkedHashMap怎么实现LRU

 1.定义变量accessOrder

public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V> {final boolean accessOrder;public LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder) {super(initialCapacity, loadFactor);this.accessOrder = accessOrder;}
}

2.最近访问的节点移动到链表末尾

 

public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V> {void afterNodeAccess(Node<K,V> e) { // move node to lastLinkedHashMapEntry<K,V> last;if (accessOrder && (last = tail) != e) { //e不是tailLinkedHashMapEntry<K,V> p =(LinkedHashMapEntry<K,V>)e, b = p.before, a = p.after;p.after = null;if (b == null){ //原来p是head,p被移到最后,那head就变成p.afterhead = a;} else{b.after = a; //b  p  a 中间p被移走,b和a需要串起来}if (a != null){ //b  p  a 中间p被移走,b和a需要串起来a.before = b;} else{ //原来a为null,说明p为tail(这个场景不是不会走进来吗?)last = b;}if (last == null){ //last为null说明链表只有一个元素,更新headhead = p;}else {p.before = last; //last  plast.after = p;}tail = p; //更新尾++modCount;}}
}

3.LruCache

3.1.LruCache.put
public class LruCache<T, Y> {@Nullablepublic synchronized Y put(@NonNull T key, @Nullable Y item) {final int itemSize = getSize(item);if (itemSize >= maxSize) {onItemEvicted(key, item);return null;}if (item != null) {currentSize += itemSize;}@Nullable Entry<Y> old = cache.put(key, item == null ? null : new Entry<>(item, itemSize));if (old != null) {currentSize -= old.size;if (!old.value.equals(item)) {onItemEvicted(key, old.value);}}evict(); //看放入之后,大小是否超过return old != null ? old.value : null;}
}
3.2.LruCache.evict
public class LruCache<T, Y> {private void evict() {trimToSize(maxSize);}
}
3.3.LruCache.trimToSize

循环移除,直到size小于maxSize,每次移除链表头元素

public class LruCache<T, Y> {protected synchronized void trimToSize(long size) {Map.Entry<T, Entry<Y>> last;Iterator<Map.Entry<T, Entry<Y>>> cacheIterator;while (currentSize > size) {cacheIterator = cache.entrySet().iterator(); //LinkedHashMap遍历last = cacheIterator.next(); //获取的是链表的第一个元素final Entry<Y> toRemove = last.getValue();currentSize -= toRemove.size; //更新移除后的sizefinal T key = last.getKey();cacheIterator.remove();  //将元素移除onItemEvicted(key, toRemove.value);}}
}

3.4.LinkedHashIterator.remove

public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>{abstract class LinkedHashIterator {public final void remove() {Node<K,V> p = current;if (p == null){throw new IllegalStateException();}if (modCount != expectedModCount){throw new ConcurrentModificationException();}current = null;K key = p.key;removeNode(hash(key), key, null, false, false); //HashMap的移除方法expectedModCount = modCount;}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/218035.shtml

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

相关文章

《地理信息系统原理》笔记/期末复习资料(9. 网络地理信息系统)

目录 9. 网络地理信息系统 9.1. 概述 9.1.1. 网络GIS概念 9.1.2. 网络GIS体系结构 9.1.3. 网络GIS内容体系 9.2. 分布式网络GIS 9.2.1. 分布式网络GIS概念 9.2.2. 分布式主要技术 9.3. WebGIS 9.3.1. WebGIS概念 9.3.2. WebGIS分类与特点 9.3.3. WebGIS技术框架 9…

自建 SMTP 邮件发送服务

搭建自己的 SMTP 邮件发送服务器 序言 SMTP 可以直接购买云厂商的服务&#xff0c;比如 : Amazon SES SMTP 阿里云邮件推送 也可以自己搭建邮件服务器 —— 发送不限量&#xff0c;综合成本低。 下面&#xff0c;我们一步一步的演示如何自建邮件服务器。 服务器选购 自托管的…

(C)一些题12

1&#xff0e;若指针 p 已正确定义&#xff0c;要使 p 指向两个连续的整型动态存储单元&#xff0c;不正确的语是 A ) p 2*( int *) malloc ( sizeof ( int )); B ) p ( int *) malloc (2* sizeof ( int )); C ) p ( int *) malloc (4*2); D ) p ( int ") calloc (2…

飞天使-docker知识点2-dockerfile构建镜像

文章目录 dockerfile 简介dockerfile 构建实例1dockerfile 直接构建nginx 本地镜像docke tag dockerfile 简介 DockerFile 可以说是一种可以被 Docker 程序解释的脚本&#xff0c;DockerFile 是由一条条的命令组成的&#xff0c;每条命令对应 linux 下面的一条命令&#xff0c…

SimCLR损失函数详解

图片来源&#xff1a;Self-Supervised Learning 超详细解读 (二)&#xff1a;SimCLR系列 文章目录 1. 数据增强2. 获得图片表征3. 正样本和负样本构建4. 计算相似度5. 计算图片之间相似的概率6. 损失函数为什么需要大规模的batchsize&#xff1f; 1. 数据增强 有一批batchsize…

LeetCode-旋转链表问题

1.旋转链表 题目描述&#xff1a; 给你一个链表的头节点 head &#xff0c;旋转链表&#xff0c;将链表每个节点向右移动 k 个位置。 思路&#xff1a; 这里向右移动k个位置&#xff0c;相当于从链表的倒数第k个节点处断开&#xff0c;之后再将断开的两个子链表按照相反顺序…

centos日常运维随记

# 需要生成随机字符及数字 rootAAA:~# echo $RANDOM | md5sum |cut -c 3-29 e7e8942a791146531f613c7c757 # echo $RANDOM 产生随机数据 # md5sum 随机数生成md5值 # cut -c 3-29 :md5产生的是32的md5数&#xff0c;使用cut -c 对这个数进行 第3位到第29位的截取# 在现有的…

【数据结构和算法】--队列

目录 队列的概念及结构队列的实现初始化入队出队其他一些队列函数 小结队列相关题目 队列的概念及结构 队列是只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出FIFO(First In First Out) 的原则。 入队列&#xf…

持续集成交付CICD:通过API方式上传Nexus制品

目录 一、实验 1.通过API方式上传Nexus制品 二、问题 1.如何通过API方式上传PNG图片 2.如何通过API方式上传tar.gz 与 ZIP文件 3.如何通过API方式上传Jar file文件 4.如何通过API方式上传制品&#xff08;maven类型的制品&#xff09;文件 5.如何下载制品 一、实验 1.通…

提升开发效率的免费API好物

日出日落&#xff1a;支持国内3400个城市以及国际4万个城市&#xff0c;获取指定城市/地点每日日出时间、日落时间&#xff1b;同时也支持全球任意经纬度查询&#xff0c;接口会返回该经纬度最近的日出日落信息。月出月落和月相&#xff1a;支持国内3400个城市以及国际4万个城市…

各地加速“双碳”落地,数字能源供应商怎么选?

作者 | 曾响铃 文 | 响铃说 随着我国力争2030年前实现“碳达峰”、2060年前实现“碳中和”的“双碳”目标提出&#xff0c;为各地区、各行业的低碳转型和绿色可持续发展制定“倒计时”时间表&#xff0c;一场围绕“数字能源”、“智慧能源”、“新能源”等关键词的创新探索进…

【教程】Ipa Guard为iOS应用提供免费加密混淆方案

概述&#xff1a;使用ios加固工具对ios代码保护&#xff0c;保护ios项目中的核心代码&#xff0c; #ipagurd年终大促百厂联动暖冬特惠&#xff0c;超多软控件立享惊喜优惠>> ​ 简介 iOS加固保护是直接针对ios ipa二进制文件的保护技术&#xff0c;可以对iOS APP中的可…

Leetcode—113.路径总和II【中等】

2023每日刷题&#xff08;五十七&#xff09; Leetcode—113.路径总和II 实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* …

使用 Taro 开发鸿蒙原生应用 —— 当 Taro 遇到纯血鸿蒙 | 京东云技术团队

纯血鸿蒙即将到来 在今年 8 月的「2023年华为开发者大会&#xff08;HDC.Together&#xff09;」上&#xff0c;华为正式官宣「鸿蒙Next」&#xff0c;这个更新的版本将移除所有的 AOSP 代码&#xff0c;彻底与 Android 切割&#xff0c;使其成为一个完全自主研发的操作系统&a…

数据挖掘目标(Kaggle Titanic 生存测试)

import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns1.数据导入 In [2]: train_data pd.read_csv(r../老师文件/train.csv) test_data pd.read_csv(r../老师文件/test.csv) labels pd.read_csv(r../老师文件/label.csv)[Su…

SqlServer中,数字-null的问题

一、业务描述 叫货单&#xff0c;已知叫货金额&#xff0c;填写本次付款金额&#xff0c;计算待付款金额 二、问题 在计算待付款金额时&#xff0c;偶尔会出现待付款金额为空的情况&#xff0c;百思不得其解 三、解决 仔细检查&#xff0c;发现了猫腻。 简单的说&#xff…

阿里云SMC迁移RedHat/CentOS 5 内核升级

阿里云SMC迁移RedHat/CentOS 5 内核升级 1. 起因 服务器需要迁移上阿里云,有几台服务器用的是Redhat 5.x,在使用SMC进行迁移时出现以下报错. [2023-12-13 09:50:55] [Error] Check System Info Failed, codeS16_111, msgGet OS Info Failed: [error] grub is too old for C…

33、变种卷积 - 分组卷积

这一节再了解一个卷积的变种,叫作分组卷积,这部分了解即可。 1、 什么是分组卷积 网上有很多关于分组卷积的资料。我整理了下,其实分组卷积是将卷积在channel 维度分组来计算,以达到将一个大卷积分成多个小卷积的目的。 为了清晰,我将卷积操作简化为一次最简单的乘累加运…

冒泡排序(函数)

冒泡排序&#xff0c;将一个列表中的两个元素进行比较&#xff0c;并将最小的元素交换到顶部。两个元素中较小的会冒到顶部&#xff0c;而较大的会沉到底部&#xff0c;该过程将被重复执行&#xff0c;直到所有元素都被排序。 输入格式: 输入在第1行中给出N&#xff08;1<N…