package test04.lru; /** * 用双向链表实现LRU算法 * @author * */ public class LRUPageFrame { private static class Node { Node prev; Node next; int pageNum; Node() {} Node(Node prev,Node next,int pageNum){ this.prev=prev;; this.next=next; this.pageNum=pageNum; } } private int capacity; private int currentSize; private Node first;// 链表头 private Node last;// 链表尾 public LRUPageFrame(int capacity) { this.capacity = capacity; } /** * 获取缓存中对象 * * @param key * @return */ public void access(int pageNum) { if (currentSize<capacity) { if(last==null){ last=new Node(); last.pageNum=pageNum; }else{ addToFirst(pageNum); } currentSize++; } else { Node node=last; while (node!=null&&node.pageNum!=pageNum) { node=node.prev; } //没有找到,添加到头部,删除最后一个,找到了并且不是第一个删除当前节点,添加到头部 if (node==null) { addToFirst(pageNum); removeLast(); }else if(node!=first) { addToFirst(pageNum); remove(node); } } } private void remove(Node node){ if (node.next!=null&&node.prev!=null) { node.prev.next=node.next; node.next.prev=node.prev; node=null; } else if(node.next==null){ removeLast(); } } private void removeLast(){ Node temp=last.prev; temp.next=null; last=temp; } private void addToFirst(int pageNum) { Node next=last; while (next.prev!=null) { next=next.prev; } first=new Node(null, next, pageNum); next.prev=first; } public String toString(){ StringBuilder buffer = new StringBuilder(); Node node = first; while(node != null){ buffer.append(node.pageNum); node = node.next; if(node != null){ buffer.append(","); } } return buffer.toString(); } }