Java 中的 LRU 缓存实现2025年5月6日 | 阅读 6 分钟 LRU 缓存(Least Recently Used Cache)的缩写是最近最少使用缓存。这意味着 LRU 缓存是指最近最少使用的那个缓存,其缓存大小或容量是固定的,允许用户使用 get() 和 put() 方法。当缓存满时,通过 put() 操作,它会移除最近最少使用的缓存。 在本 Java 部分,我们将简要介绍 LRU 缓存,其在 Java 中的实现,以及可以实现 LRU 缓存的几种方法。 什么是 LRU 缓存大家可能都知道,缓存是计算机内存的一部分,用于临时存储频繁使用的数据。但是缓存内存的大小是固定的,因此需要一种管理机制来移除不需要的数据并存储新数据。这时 LRU 就派上用场了。因此,LRU 是一种缓存替换算法,用于通过移除最近最少使用的数据来为新数据腾出内存空间。 在 Java 中实现 LRU 缓存要在 Java 中实现 LRU 缓存,我们可以通过以下两种数据结构来实现 LRU 缓存: 队列: 使用双向链表,可以实现一个队列,队列的最大大小将等于缓存大小(总帧数)。很容易发现最近最少使用的页面位于队头附近,而最近最少使用的页面位于双向链表的队尾附近。 哈希: 这里的键代表页码的哈希值,值代表相应队列节点的地址。 理解 LRU每当用户引用一个页面时,可能会有两种情况。一种是页面已在内存中,如果是,则只需将链表节点分离并将其移到队列的前面。另一种是页面不在内存中(不存在),则将其移入内存。为此,用户在队列前面插入一个新节点,然后更新哈希表中相应节点的地址。如果用户确定队列已满(所有帧都已满),只需从队尾移除一个节点,然后在队列前面添加新节点。 LRU 示例给定如下引用字符串: 1, 2, 3, 4, 1, 2, 5, 1, 2, 3, 4, 5 因此,使用 LRU 页替换算法,可以找到页面数为 3 时的缺页次数。 在下面的图表中,您可以看到我们如何执行 LRU 算法来查找缺页次数。 ![]() 通过队列实现 LRU 缓存要通过队列实现 LRU 缓存,我们需要使用双向链表。尽管代码足够长,但这是 LRU 缓存的基本实现版本。 以下是代码: 代码解释
因此,执行上述代码后,我们得到了下面显示的输出: ![]() 使用 LinkedHashMap 实现 LRU 缓存LinkedHashMap 类似于 HashMap,但在 LinkedHashMap 中,有一个功能允许用户维护插入到 LinkedHashMap 中的元素的顺序。因此,LinkedHashMap 的此功能使 LRU 缓存实现变得简单而简短。如果使用 HashMap 实现,我们会得到不同的元素序列,因此我们可能需要编写更多代码来排列这些元素,但使用 LinkedHashMap,我们无需增加更多代码行。 以下是让您使用 LinkedHashMap 实现 LRU 缓存的代码: 代码解释
当我们执行上述代码时,我们得到了下面显示的输出: ![]() 从输出中可以清楚地看出,与上面一个相比,我们用更少的代码行获得了正确的结果。 因此,这样我们就可以在 Java 中实现 LRU 缓存并对其进行表示。 |
回文链表是指其元素序列正读反读都相同的链表。要确定链表是否为回文,我们需要将链表的前半部分与反转的后半部分进行比较,同时……
阅读 12 分钟
是当今世界上最流行的编程语言之一,广泛应用于从 Web 开发到移动应用程序开发的各种应用。Java 由 James Gosling 及其团队于 1990 年在 Sun Microsystems 开发。它因其简洁、易于……
阅读 4 分钟
在 Java 中,一元运算符是只能与一个操作数一起使用的运算符。它用于表示正值或负值、将值加/减 1,以及对布尔值取反。一元运算符的类型 Java 中有五种一元运算符:一元...
5 分钟阅读
Collection.forEach() 和 Collection.stream().forEach() 都用于遍历集合,并且彼此之间没有显著差异。两者之间没有重大区别,因为它们都提供相同的结果。但是,有一些区别。Collection.stream().forEach() 方法对对象组进行迭代...
阅读 4 分钟
问题如下:给定一个整数序列,您需要找出序列中缺失的最小正整数。序列中也可能包含重复的元素,以及负数,甚至……
5 分钟阅读
由于强大的继承系统,Java 中的一个类可以通过继承另一个类的特征和行为。在处理继承时,构造函数对于初始化对象和维护类的正确运行至关重要。在本节中,我们将探讨构造函数的功能……
阅读 4 分钟
Java KeyStore 是一个包含证书的文件。这些证书用于 Java 代码中。KeyStore 及其中的证书用于从 Java 代码建立安全连接。存储的证书可以有几种格式。Java KeyStore 表示……
阅读 4 分钟
Java 作为一种多功能且功能强大的编程语言,能够处理各种数学运算,包括涉及巨大数字的运算。巨大数字通常远超 int 和 long 等标准数据类型的范围,需要特殊处理。在本节中,我们将……
5 分钟阅读
在不断发展的软件开发世界中,并发和并行是基本概念。这些技术使开发人员能够充分利用现代多核处理器,从而更快、更有效地执行程序。Java 作为一种广泛使用的编程语言,一直提供支持并发的功能……
阅读 8 分钟
在 Java 中,int、char 和 float 等原始数据类型变量是按值传递的。这意味着变量值的副本会被发送到方法或函数。然而,在传递 String 等对象时,按引用传递的区别……
阅读 4 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India