LRU 缓存机制
// LRU缓存机制 // 使用哈希表+双向链表 // 双向链表的头部是最近使用过的,双向链表的尾部是最久未使用过的 class LRUCache { // 双向链表的节点 class DoublyLinkedNode { int key; int value; DoublyLinkedNode prev; DoublyLinkedNode next; // 无参构造器 public DoublyLinkedNode() { } // 有参构造器 public DoublyLinkedNode(int _key, int _value) { key = _key; value = _value; } } int size; int capacity; DoublyLinkedNode head; // 伪头部 DoublyLinkedNode tail; // 伪尾部 Map<Integer, DoublyLinkedNode> cache = new HashMap<>(); // 双向链表 public LRUCache(int capacity) { this.size = 0; this.capacity = capacity; head = new DoublyLinkedNode(); tail = new DoublyLinkedNode(); head.next = tail; tail.prev = head; } public int get(int key) { DoublyLinkedNode node = cache.get(key); if (node == null) { // 关键字不存在 return -1; } // 刚查询过 移动到头部 moveToHead(node); return node.value; } public void put(int key, int value) { DoublyLinkedNode node = cache.get(key); if (node == null) { // 创建一个新节点 DoublyLinkedNode newNode = new DoublyLinkedNode(key, value); cache.put(key, newNode); addToHead(newNode); // 添加到头部 size++; if (size > capacity) { // 删除链表尾部元素 DoublyLinkedNode tail = removeTail(); // 删除链表尾部 cache.remove(tail.key); size--; } } else { // 如果关键字已经存在,则变更其数值 node.value = value; moveToHead(node); // 移动到头部 } } // 移动到头部 public void moveToHead(DoublyLinkedNode node) { removeNode(node); addToHead(node); } // 删除节点 public void removeNode(DoublyLinkedNode node) { node.prev.next = node.next; node.next.prev = node.prev; } // 增加节点到头部 public void addToHead(DoublyLinkedNode node) { node.prev = head; node.next = head.next; head.next.prev = node; head.next = node; } // 删除尾部节点 public DoublyLinkedNode removeTail() { DoublyLinkedNode node = tail.prev; removeNode(node); return node; } } /** * Your LRUCache object will be instantiated and called as such: * LRUCache obj = new LRUCache(capacity); * int param_1 = obj.get(key); * obj.put(key,value); */
作者:Ryanjie
出处:http://www.cnblogs.com/ryanjan/
本文版权归作者和博客园所有,欢迎转载。转载请在留言板处留言给我,且在文章标明原文链接,谢谢!
如果您觉得本篇博文对您有所收获,觉得我还算用心,请点击右下角的 [推荐],谢谢!