package week4.origin.jvm.loader;
/**
* 用双向链表实现LRU算法
* @author liuxin
*
*/
public class LRUPageFrame {
private int capacity;
private int curSize;//记录当前缓存大小
private Node first;// 链表头
private Node last;// 链表尾
public LRUPageFrame(int capacity) {
this.capacity = capacity;
curSize=0;
}
/**
* 获取缓存中对象
*
* @param key
* @return
*/
public void access(int pageNum) {
if(capacity <=0 ){
throw new IndexOutOfBoundsException();
}
if(curSize == 0){
Node node=new Node(null,null,pageNum);
curSize++;
first=node;
last=node;
return ;
}
if(first.pageNum == pageNum){
return ;
}
//不管是否需要置换头指针均需要改变
Node node=new Node(null,first,pageNum);
first.prev=node;
first=node;
if(curSize == 1){
last.prev=node;
}
if(curSize < capacity){
curSize++;
return ;
}
if(curSize == capacity){//容量不足,开始置换
//首先判断里面是否存在值相同元素
Node curNode=first.next;
while(curNode.next!=null){
if(curNode.pageNum == pageNum){//如果找到
curNode.prev.next=curNode.next;
curNode.next.prev=curNode.prev;
return ;
}
curNode=curNode.next;
}
Node tempNode=last.prev;
last=tempNode;
last.next=null;
}
}
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();
}
private static class Node {
Node prev;
Node next;
int pageNum;
public Node(Node prev,Node next,int pageNum){
this.prev=prev;
this.next=next;
this.pageNum=pageNum;
}
}
}