LinkedHashMap内部维护一个一个双向链表和一个hash表,所以在O(1)的时间复杂度下实现LRU。
/**
- 使用jdk库类实现LRU
*/
class LRUCacheByLinkedHashMap {
private LinkedHashMap<Integer, Integer> 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<Map.Entry<Integer, Integer>> 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<Integer, Node> 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);
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
最近我根据上述的技术体系图搜集了几十套腾讯、头条、阿里、美团等公司21年的面试题,把技术点整理成了视频(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分
图片转存中…(img-3JrdFwbf-1711111680134)]
最近我根据上述的技术体系图搜集了几十套腾讯、头条、阿里、美团等公司21年的面试题,把技术点整理成了视频(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分
[外链图片转存中…(img-93CFlrMT-1711111680135)]