数据结构~缓存淘汰算法--LRU算法(Java的俩种实现方式,万字解析

本文涉及的产品
云解析DNS,个人版 1个月
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 数据结构~缓存淘汰算法--LRU算法(Java的俩种实现方式,万字解析

LinkedHashMap内部维护一个一个双向链表和一个hash表,所以在O(1)的时间复杂度下实现LRU。

/**
• 使用jdk库类实现LRU
*/
class LRUCacheByLinkedHashMap {
private LinkedHashMap nodes;
private int size;
public LRUCacheByLinkedHashMap(int capacity) {
//实现LRU的linkedHashMap的构造方法
nodes = new LinkedHashMap<>(capacity, 0.75f, true);
this.size = capacity;
}
public int get(int key) {
Integer ret = nodes.get(key);
return ret == null ? -1 : ret;
}
public void put(int key, int value) {
nodes.put(key, value);
if (nodes.size() > size) {
//使用迭代器删除第一个数据
Iterator> iterator = nodes.entrySet().iterator();
if (iterator.hasNext()) {
iterator.next();
iterator.remove();
}
}
}
}

自己实现LRU

我们通过看LinkedHashMap的源代码,知道其所以然后就可以自己实现它。

class LRUCache {
static class Node {
int key;
int val;
Node prev;
Node next;
private Node(){}
public Node(int key, int val) {
this.key = key;
this.val = val;
}
}
private int size;
private HashMap map;
private int capacity;
private Node head;
private Node tail;
public LRUCache(int capacity) {
this.size = 0;
this.capacity = capacity;
map = new HashMap<>();
head = new Node();
tail = new Node();
head.next = tail;
tail.prev = head;
}
public int get(int key) {
Node node = map.get(key);
if (node == null) {
//没有这个节点
return -1;
}
//需要移动到最前面
moveHead(node);


相关文章
|
3天前
|
安全 Java 数据处理
Java并发编程:线程同步与协作的深度解析
在探索Java并发编程的海洋中,线程同步与协作的灯塔指引着航向。本文将深入挖掘线程同步机制的核心原理,揭示锁、条件变量等工具如何确保数据的一致性和线程间有序的通信。通过案例分析,我们将解码高效并发模式背后的设计哲学,并探讨现代Java并发库如何简化复杂的同步任务。跟随文章的步伐,您将获得提升多线程应用性能与可靠性的关键技能。 【7月更文挑战第24天】
18 5
|
3天前
|
搜索推荐 算法
【数据结构】排序算法——Lesson2
【7月更文挑战第24天】
9 3
|
5天前
|
缓存 安全 算法
Java内存模型深度解析与实践应用
本文深入探讨Java内存模型(JMM)的核心原理,揭示其在并发编程中的关键作用。通过分析内存屏障、happens-before原则及线程间的通信机制,阐释了JMM如何确保跨线程操作的有序性和可见性。同时,结合实例代码,展示了在高并发场景下如何有效利用JMM进行优化,避免常见的并发问题,如数据竞争和内存泄漏。文章还讨论了JVM的垃圾回收机制,以及它对应用程序性能的影响,提供了针对性的调优建议。最后,总结了JMM的最佳实践,旨在帮助开发人员构建更高效、稳定的Java应用。
|
4天前
|
安全 Java 编译器
Java内存模型深度解析
【7月更文挑战第23天】在探索Java的高效与稳定性之谜时,我们不可避免地要深入其核心——Java内存模型(JMM)。本文将揭开JMM的神秘面纱,从基本概念到底层实现机制,再到并发编程中的应用实践,全面剖析这一确保Java程序正确性的基石。通过理解JMM的设计哲学和运作原理,开发者能够更好地编写出既高效又线程安全的代码,避免那些隐藏在多线程环境下的陷阱。
|
10天前
|
存储 监控 算法
Java 内存管理与垃圾回收机制深度解析
本文深入探讨了Java的内存管理与垃圾回收(GC)机制,从JVM内存结构出发,详细分析了堆、栈、方法区的职能及交互。文章重点讨论了垃圾回收的核心概念、常见算法以及调优策略,旨在为Java开发者提供一套系统的内存管理和性能优化指南。 【7月更文挑战第17天】
|
10天前
|
Java 编译器 开发者
Java 内存模型深度解析
本文旨在深入探讨Java内存模型的复杂性及其对并发编程的影响。通过揭示内存模型的核心原理、JMM的结构,并结合具体案例和数据分析,本文将帮助读者理解Java内存模型如何确保多线程程序的正确性和性能,以及如何在实际应用中有效利用这一模型进行高效的并发编程。 【7月更文挑战第17天】
18 4
|
11天前
|
Java
Java中的异常处理机制深度解析
本文旨在深入探讨Java语言中异常处理的机制,从基础概念到高级应用,全面剖析try-catch-finally语句、自定义异常以及异常链追踪等核心内容。通过实例演示和代码分析,揭示异常处理在Java程序设计中的重要性和应用技巧,帮助读者构建更为健壮和易于维护的程序。
|
13天前
|
监控 Java API
Java并发编程之线程池深度解析
【7月更文挑战第14天】在Java并发编程领域,线程池是提升性能、管理资源的关键工具。本文将深入探讨线程池的核心概念、内部工作原理以及如何有效使用线程池来处理并发任务,旨在为读者提供一套完整的线程池使用和优化策略。
|
14天前
|
存储 算法 Python
“解锁Python高级数据结构新姿势:图的表示与遍历,让你的算法思维跃升新高度
【7月更文挑战第13天】Python中的图数据结构用于表示复杂关系,通过节点和边连接。常见的表示方法是邻接矩阵(适合稠密图)和邻接表(适合稀疏图)。图遍历包括DFS(深度优先搜索)和BFS(广度优先搜索):DFS深入探索分支,BFS逐层访问邻居。掌握这些技巧对优化算法和解决实际问题至关重要。**
16 1
|
3天前
|
存储 监控 算法
Java中的垃圾回收机制深度解析
在Java的内存管理中,垃圾回收机制(Garbage Collection, GC)扮演着至关重要的角色。本文将深入探讨Java垃圾回收的工作原理、常见的垃圾回收算法以及调优策略,旨在帮助开发者更好地理解和掌握这一核心机制,进而优化Java应用的性能表现。
14 0

推荐镜像

更多