Caching LRU缓存键、值、节点。值真实世界解释

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

我了解LRU缓存在原则上是如何工作的。例如,请参见此处:

然而,我很难理解这在现实世界中是如何解释的。例如,如果我想存储对象(没有自然编号/顺序),我知道值(在hashmap中)只是指向链接列表中节点的指针,但键代表什么


此外,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) {
      ...
    }