lru算法 java实现
LRU(LeastRecentlyUsed)算法是一种常用的缓存淘汰策略,它根据数据最近使用的频率来淘汰缓存中的数据。在Java中,可以使用哈希表和双向链表来实现LRU算法。
一、实现思路
1.创建一个哈希表来存储缓存数据,使用键值对的形式表示缓存中的数据和对应的访问时间。
2.创建一个双向链表,用于存储缓存数据的访问顺序。最近使用的数据会放在链表的头部,最久未使用的数据会放在链表的尾部。
3.在访问缓存数据时,如果数据不存在于哈希表中,则需要将数据添加到哈希表中,并更新其访问时间。如果数据已经存在于哈希表中,则需要更新其访问时间并移动到链表的头部。
4.在需要淘汰缓存数据时,可以遍历链表并依次删除头部节点,直到只剩下最后一个节点为止。最后需要将最后一个节点所代表的数据从哈希表中删除。
二、代码实现
下面是一个基于上述思路的LRU算法的Java实现示例:
```java
importjava.util.HashMap;
importjava.util.Map;
publicclassLRUCache{
privateintcapacity;
privateHashMap<Integer,Node>cacheMap;
privateLinkedList<Integer>list;
publicLRUCache(intcapacity){
access被淘汰了吗this.capacity=capacity;
this.cacheMap=newHashMap<>();
this.list=newLinkedList<>();
}
publicintget(intkey){
if(!ainsKey(key)){
return-1;//缓存中不存在该键值对,返回-1表示失败
}
(key);//获取该键值对的节点对象
ve(node);//从链表中移除该节点
list.addFirst(key);//将该节点移动到链表头部表示最近使用过
returnnode.value;//返回该节点的值
}
publicvoidput(intkey,intvalue){
ainsKey(key)){//如果缓存中已经存在该键值对,更新其访问时间并移动到链表头部
(key);
node.accessTime=System.currentTimeMillis();//更新访问时间并从链表中移除该节点
ve(node);//从链表中移除该节点
list.addFirst(node);//将该节点移动到链表头部表示最近使用过
}else{//如果缓存中不存在该键值对,则需要添加新节点并更新其访问时间,同时将其放入链表头部表示最近使用过
NodenewNode=newNode(key,System.currentTimeMillis(),value);//创建新节点对象
cacheMap.put(key,newNode);//将新节点添加到哈希表中
list.addFirst(newNode);//将新节点移动到链表头部表示最近使用过
if(cacheMap.size()>capacity){//如果缓存已满,需要淘汰链表尾部的节点和对应的键值对数据
veTail();//移除链表尾部的节点和对应的键值对数据并返回该节点对象(用于后续处理)
ve(tailNode.key);//从哈希表中删除对应的键值对数据
}
}
}
}
```
其中,Node类表示一个缓存数据节点对象,包含键(key)、访问时间(accessTime)、值(value)等属性。LinkedList类表示一个双向链表,用于存储缓存数据的访问顺序。在get和put方法中,需要遍历链表并依次删除头部节点,直到只剩下最后一个节点为止。最后需要将最后一个节点所代表的数据从哈希表中删除。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论