基于Java实现的LRU算法,特别适合新手,带有测试case
![preview](https://csdnimg.cn/release/downloadcmsfe/public/img/white-bg.ca8570fa.png)
![preview-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/scale.ab9e0183.png)
LRU(Least Recently Used)算法是一种常用的页面替换策略,它基于“最近最少使用”的原则,当内存空间不足时,会优先淘汰最近最久未使用的数据。在Java中,LRU算法通常用于缓存的设计,例如在数据库连接池、内存数据库等场景中。下面将详细介绍LRU算法的基本原理、Java实现及其测试。 ### LRU算法原理 LRU算法的核心思想是:当内存空间不足以存放新的数据时,优先淘汰最近最久未使用的数据。它通过维护一个有序的数据结构(如链表或平衡二叉搜索树),来跟踪每个数据项的访问时间。新插入的数据会被放到链表的尾部,而当访问已存在的数据时,将其移动到链表尾部。这样,链表头部的数据就是最近最少使用的,当需要淘汰数据时,就从头部开始。 ### Java实现LRU算法 在Java中,我们可以使用`LinkedHashMap`来实现LRU算法,因为它提供了O(1)的时间复杂度的`get`、`put`和`remove`操作,并且可以设置其为访问顺序或插入顺序。以下是一个简单的LRU缓存实现: ```java import java.util.HashMap; import java.util.Map; public class LRUCache<K, V> { private int capacity; private Map<K, Node<K, V>> map; private Node<K, V> head, tail; public LRUCache(int capacity) { this.capacity = capacity; this.map = new HashMap<>(capacity); this.head = new Node<>(null, null, null); this.tail = new Node<>(null, head, null); head.next = tail; } public V get(K key) { if (map.containsKey(key)) { Node<K, V> node = map.get(key); remove(node); add(node); return node.value; } return null; } public void put(K key, V value) { if (map.containsKey(key)) { remove(map.get(key)); } Node<K, V> newNode = new Node<>(key, value, null); add(newNode); map.put(key, newNode); if (map.size() > capacity) { remove(head.next); } } private void add(Node<K, V> node) { node.next.prev = node; node.prev.next = node; tail.prev = node; node.next = tail; tail = node; } private void remove(Node<K, V> node) { node.prev.next = node.next; node.next.prev = node.prev; } private static class Node<K, V> { K key; V value; Node<K, V> prev, next; public Node(K key, V value, Node<K, V> next) { this.key = key; this.value = value; this.next = next; this.prev = next.prev; next.prev.next = this; next.prev = this; } } } ``` 在这个实现中,我们使用了一个双向链表和一个HashMap来存储数据。`add`和`remove`方法用于操作链表,`get`和`put`方法实现了LRU缓存的逻辑。 ### 测试LRU算法 为了验证LRU算法的正确性,我们需要编写测试用例。可以使用JUnit或其他的测试框架进行单元测试,确保在不同情况下缓存都能正确地按照LRU策略淘汰数据。以下是一个简单的测试案例: ```java import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; public class LRUCacheTest { @Test public void testLRUCache() { LRUCache<Integer, String> cache = new LRUCache<>(2); // 插入数据并检查 cache.put(1, "one"); assertEquals("one", cache.get(1)); cache.put(2, "two"); assertEquals("two", cache.get(2)); // 检查淘汰行为 cache.put(3, "three"); assertNull(cache.get(1)); // 1 应该被淘汰 assertEquals("two", cache.get(2)); assertEquals("three", cache.get(3)); // 再次淘汰 cache.put(4, "four"); assertNull(cache.get(2)); // 2 应该被淘汰 assertEquals("three", cache.get(3)); assertEquals("four", cache.get(4)); } } ``` 这个测试用例涵盖了基本的添加、获取、淘汰操作,以及对LRU策略的验证。 总结来说,LRU算法是一种高效的数据淘汰策略,Java中的`LinkedHashMap`为我们提供了一个便利的实现方式。理解并掌握LRU算法,有助于我们在设计和优化缓存系统时做出更好的决策。通过编写测试用例,我们可以确保算法的正确性和稳定性。
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![txt](https://img-home.csdnimg.cn/images/20210720083642.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![package](https://csdnimg.cn/release/downloadcmsfe/public/img/package.f3fc750b.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
- 1
![avatar-default](https://csdnimg.cn/release/downloadcmsfe/public/img/lazyLogo2.1882d7f4.png)
![avatar](https://profile-avatar.csdnimg.cn/1f57a87c637041c09e0157ab233adb05_qq_37606901.jpg!1)
- 粉丝: 1036
- 资源: 38
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![voice](https://csdnimg.cn/release/downloadcmsfe/public/img/voice.245cc511.png)
![center-task](https://csdnimg.cn/release/downloadcmsfe/public/img/center-task.c2eda91a.png)
最新资源
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback-tip](https://img-home.csdnimg.cn/images/20220527035111.png)
![dialog-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/green-success.6a4acb44.png)