package com.coding.basic.linklist; /** * 用双向链表实现LRU算法 * @author ZJ * */ public class LRUPageFrame { private static class Node { Node prev; Node next; Object obj; Node() { } } private int capacity;//容量 private int size;//已经存放的数量 private Node first;// 链表头 private Node last;// 链表尾 public LRUPageFrame(int capacity) { this.capacity = capacity; } /** * 获取缓存中对象 * * @param key * @return */ public void access(Object obj) { if(obj == null){ return; } Node node = getNode(obj); if(node!=null){ move2head(node); }else{ refresh(obj); } } /** * 刷新LRU队列 * @param obj */ private void refresh(Object obj) { //添加元素 if(size<capacity){ add(obj); }else{ remove(); add(obj); } } /** * 添加 * @param obj */ private void add(Object obj){ Node node = new Node(); node.obj = obj; if(first == null){ first = node; last = node; }else{ node.next = first; node.next.prev = node; first = node; } size++; } /** * 删除 * @return */ private Object remove(){ Object obj = last.obj; last = last.prev; last.next = null; size --; return obj; } /** * 是否存在缓存中 * @param obj * @return */ @SuppressWarnings("unused") private boolean isExist(Object obj){ return getNode(obj)!=null?true:false; } /** * 获取包含值为obj的节点 * @param obj * @return */ private Node getNode(Object obj){ for (Node node = first; node != null; node = node.next) { if(node.obj.equals(obj)){ return node; } } return null; } /** * 将节点置为头结点 * @param obj */ private void move2head(Node node){ if(node != null){ if(node.equals(first)){//该节点为头结点 return; }else if(node.equals(last)){//该节点为尾节点 last = last.prev; last.next = null; }else{ node.prev.next = node.next; node.next.prev = node.prev; } //将本节点置为头结点 first.prev = node; node.next = first; first = node; } } public String toString(){ StringBuilder buffer = new StringBuilder(); Node node = first; while(node != null){ buffer.append(node.obj); node = node.next; if(node != null){ buffer.append(","); } } return buffer.toString(); } }