lru缓存

哈希表 + 双向链表

//定义元素

public class LRUCache {

class DLinkedNode {

int key;

int value;

DLinkedNode prev;

DLinkedNode next;

public DLinkedNode() {}

public DLinkedNode(int _key, int _value) {key = _key; value = _value;}

}

private Map<Integer, DLinkedNode> cache = new HashMap<Integer, DLinkedNode>();

private int size;

private int capacity;

private DLinkedNode head, tail;


 

public LRUCache(int capacity) {

this.size = 0;

this.capacity = capacity;

// 使用伪头部和伪尾部节点

head = new DLinkedNode();

tail = new DLinkedNode();

head.next = tail;

tail.prev = head;

}

public int get(int key){

DLinkedNode node = cache.get(key);

if(node == null){

return -1;

}

//将该值放到链表的头部

moveToHead(node);

return node.value;

}

public void put(int key, int value){

DLinkedNode node = cache.get(key);

if(node == null){

//创建新节点

DLinkedNode newNode = new DLinkedNode(key,value);

//添加进cache

cache.put(key,newNode);

//添加至双向链表的头部

addToHead(newNode);

++size;

if(size > capacity){

//如果超出容量,删除掉链表的尾部节点

DLinkedNode removeNode = removeTail();

//删除哈希表中对应的项

cache.remove(removeNode.key);

--size;

}

} else{

node.value = value;

moveToHead(node);

}

}


 

public void addToHead(DLinkedNode node){

node.prev = head;

node.next = head.next;

head.next.prev = node;

head.next = node;

}

public void moveToHead(DLinkedNode node){

removeNode(node);

addToHead(node);

}

public void removeNode(DLinkedNode node){

node.prev.next = node.next;

node.next.prev = node.prev;

}

public DLinkedNode removeTail(){

DLinkedNode node = tail.prev;

removeNode(node);

return node;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值