Caching LRU缓存键、值、节点。值真实世界解释
我了解LRU缓存在原则上是如何工作的。例如,请参见此处: 然而,我很难理解这在现实世界中是如何解释的。例如,如果我想存储对象(没有自然编号/顺序),我知道值(在hashmap中)只是指向链接列表中节点的指针,但键代表什么Caching LRU缓存键、值、节点。值真实世界解释,caching,data-structures,linked-list,hashmap,lru,Caching,Data Structures,Linked List,Hashmap,Lru,我了解LRU缓存在原则上是如何工作的。例如,请参见此处: 然而,我很难理解这在现实世界中是如何解释的。例如,如果我想存储对象(没有自然编号/顺序),我知道值(在hashmap中)只是指向链接列表中节点的指针,但键代表什么 此外,node.value代表什么?我认为这是正在缓存的实际对象。但是,这与hashmap中的键是如何对应的?典型的hashmap具有任意类型的键和值。键是您想要索引结构的对象,值是您想要存储和检索的对象。在java中考虑一个普通的HASMAP: Map<UUID, Pe
此外,node.value代表什么?我认为这是正在缓存的实际对象。但是,这与hashmap中的键是如何对应的?典型的hashmap具有任意类型的键和值。键是您想要索引结构的对象,值是您想要存储和检索的对象。在java中考虑一个普通的HASMAP:
Map<UUID, Person> peopleById = new HashMap<>();
UUID是键,Person是值
您链接到的参考实现不使用泛型,它只支持int
到int
,这相当于Map
。参考实现中的节点
类不应该在公共方法中公开。因此,在该参考实现中,节点
应该是隐藏的,删除(节点)
和设置头(节点)
应该是私有的,因为否则它们会公开缓存的实现细节
一个更好的实现应该是这样的(在我脑子里做这件事,可能会有编译错误,仅供说明):
公共类LRUCache实现Map{
私有静态类节点{
键型键;
值类型值;
节点前置;
节点下一步;
公共节点(KeyType键、ValueType值){
this.key=key;
这个值=值;
}
}
国际能力;
HashMap=newHashMap();
节点头=空;
Node end=null;
公共LRUCache(内部容量){
这个。容量=容量;
}
public ValueType get(键类型键){
...
}
公共集(键类型键、值类型值){
...
}
私有无效删除(节点){
...
}
专用无效设置头(节点){
...
}
Map<UUID, Person> cachedPeopleById = new LRUCache<>(10);
public class LRUCache <KeyType, ValueType> implements Map<KeyType, ValueType> {
private static class Node <KeyType, ValueType> {
KeyType key;
ValueType value;
Node prev;
Node next;
public Node(KeyType key, ValueType value){
this.key = key;
this.value = value;
}
}
int capacity;
HashMap<KeyType, Node> map = new HashMap<>();
Node head=null;
Node end=null;
public LRUCache(int capacity) {
this.capacity = capacity;
}
public ValueType get(KeyType key) {
...
}
public set(KeyType key, ValueType value) {
...
}
private void delete(Node<KeyType, ValueType> node) {
...
}
private void setHead(Node<KeyType, ValueType> node) {
...
}