相信很多人都会直接使用LinkedHashMap来实现LRUMap。
需要注意的是,LinkedHashMap不是线程安全的,在多线程情况下会出错,什么情况都可能发生。会出现LRUMap的最大值失效。
一般来说,LRUMap的失效情况有两种。
1. get和put方法没有同步,特别是get方法,因为get方法会有写入操作。
put和get操作都需要同步,可以直接重写LinkedHashMap的get和put方法,加入synchronized。或者用concurrency的ReentrantReadWriteLock。
2.置入LRUMap的key的hashCode和equals方法,要保证它的恒等性,否则LRUMap会失效。
为啥会有这种情况发生呢?因为如果hashCode操作两次不等,会造成LRUMap不会删除多余元素,造成内存泄漏。
容易忽视的一点是,Java集合类的hashCode都是可变的,比如List,HashMap等,它们的hashCode随着成员的变化而变化。
所以,如果将集合类作为LRUMap的key,那么很有可能LRUMap会失效。
分享到:
相关推荐
LRU(Least Recently Used)是最常用的页面替换算法之一,它基于“最近最少使用”的原则,即当内存空间不足时,最长时间未被使用的数据会被优先淘汰。在这个Java实现的LRU算法示例中,我们将深入探讨LRU的核心概念、...
在Java编程语言中,`Map`接口是集合框架的一部分,它提供了一种存储键值对...在实际项目中,根据需求可以选择不同的`Map`实现,如`HashMap`、`TreeMap`、`LinkedHashMap`等,每种实现都有其特定的性能特性和使用场景。
K,V> p) { } 这些方法是 ...通过回调方法和 `accessOrder` 属性,LinkedHashMap 实现了动态维护顺序的功能,使得在遍历 Map 时可以保持一定的顺序,这对于需要有序输出或者基于访问频率进行缓存淘汰的场景非常有用。
将LinkedHashMap转换为json,反之亦然 如何使用 LinkedHashMap requestData = new LinkedHashMap(); LinkedHashMap auth =新的LinkedHashMap(); auth.put(“ ServiceName”,“ Login”); auth.put(“ ...
3. **创建新Map**:为了保持排序后的顺序不变,这里使用了`LinkedHashMap`,这是一种能够保持插入顺序的Map实现。 4. **填充新Map**:将排序后的映射关系逐一添加到新的`LinkedHashMap`中。 5. **返回排序后的Map**...
在Java编程中,将数组转换为Map是一种常见的数据结构转换操作。这有助于提高查询效率,因为Map提供了O(1)的时间复杂度来访问元素。在本篇内容中,我们将深入探讨如何在Java中实现这个转换过程,以及相关的重要知识点...
Python中,有第三方库`functools.lru_cache`提供了内置的LRU缓存功能。在C++中,可以自定义数据结构来实现LRU缓存。 LRU缓存策略不仅应用于操作系统内存管理,还广泛应用于数据库系统、Web服务器、分布式系统等领域...
`Collectors.toMap()`用于将排序后的Stream转换回Map,其中`LinkedHashMap`确保了排序顺序。 ### 2. 按Map的值排序 若需按Map的值进行排序,可以自定义一个Comparator,如下所示: ```java Map, Integer> ...
System.out.println(key + " : " + linkedHashMap.get(key)); } ``` 输出将是: ``` 沉 : 沉默王二 默 : 沉默王二 王 : 沉默王二 二 : 沉默王二 ``` 与HashMap不同,LinkedHashMap在遍历时会按照元素的插入顺序依次...
- `LinkedHashMap`:保持插入顺序或访问顺序的HashMap,适用于需要保持插入顺序或者根据最近最少使用(LRU)策略的场景。 以下是一个使用HashMap的示例,展示了如何创建Map、添加元素、遍历Map以及执行其他操作: ``...
LRU(Least Recently Used)算法是一种常见的页面替换算法,用于解决计算机内存有限而数据页数量过多的问题。在操作系统中,当内存不足以容纳所有活动页面时,LRU算法会选择最近最久未使用的页面进行淘汰,以腾出...
2. 需要按最近使用(LRU)策略进行缓存淘汰时,LinkedHashMap可以方便地根据访问顺序实现。 总的来说,LinkedHashMap结合了HashMap的高效性和有序性的特点,适用于那些对元素顺序有特定需求但又希望保持高效性能的...
下面是一个简单的基于`LinkedHashMap`的LRU缓存实现示例: ```java import java.util.HashMap; import java.util.Map; import java.util.LinkedHashMap; public class LRUCache, V> { private final int capacity...
Map接口的主要实现类有HashMap、TreeMap和LinkedHashMap。 - HashMap:基于哈希表实现,不保证元素顺序,插入和查询速度较快。键和值都可以是null,但是键必须是唯一的。 - TreeMap:实现了SortedMap接口,基于红黑...
计算机后端-Java-Java核心基础-第25章 集合02 12. HashMap在JDK8中的源码分析.avi
LRU(Least Recently Used)是最常用的页面替换算法之一,它基于“最近最少使用”的原则,即当内存空间不足时,最长时间未被使用的数据会被优先淘汰。在这个Java程序中,我们将会探讨如何实现LRU算法,并通过分析`...
在Java中,可以使用`LinkedHashMap`实现LRU,因为它的插入和删除操作具有O(1)的时间复杂度,并能按照访问顺序自动排序。 现在让我们看看Java中如何实现这些算法: 对于FIFO,可以创建一个`LinkedList`存储缓存中的...