package com.donaldy.basic; /** * 用双向链表实现LRU算法 * @author liuxin * */ public class LRUPageFrame { private static class Node { Node prev; Node next; int pageNum; Node( int pageNum) { this.pageNum = pageNum; } } private int capacity; private Node first;// 链表头 private Node last;// 链表尾 private int spareNum = 3; public LRUPageFrame(int capacity) { this.capacity = capacity; } /** * 获取缓存中对象 * * @param pageNum * @return */ public void access(int pageNum) { /** * 1.找到, * 则将此元素提到队首 * 2.找不到,则new一个,并加在队首 * 1.队伍是满,则踢掉队尾 * 2.队伍不满,则添加在队首 */ Node node = first; while (node != null) { if (pageNum == node.pageNum) { if (node == first) return; if (node == last) { final Node prevNode = node.prev; prevNode.next = null; last = prevNode; node.prev = null; node.next = first; first.prev = node; first = node; return ; } final Node prevNode = node.prev; final Node nextNode = node.next; prevNode.next = nextNode; nextNode.prev = prevNode; node.prev = null; node.next = first; first = node; return; } node = node.next; } Node newNode = new Node(pageNum); if (spareNum == 0) { final Node f = first; final Node l = last; f.prev = newNode; newNode.next = f; first = newNode; last = l.prev; last.next = null; l.prev = null; return ; } if (spareNum == capacity) { first = newNode; last = newNode; spareNum --; return; } first.prev = newNode; newNode.next = first; first = newNode; spareNum --; } 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(); } }