编程语言
首页 > 编程语言> > 用java精简的实现LRU

用java精简的实现LRU

作者:互联网

  1. 设计一个Page类模拟内存(int pageID,String content),因为content是变的,所以只使用pageId来进行equals和hash。
  2. 设计一个LRUCollection类的要点:核心接口是get(pageId),get的设计要点其实就是要使用什么样的数据结构的问题,下面分析需求来决定使用什么样的数据结构。
    1. 必须要能根据这个id拿到相应的page,可以使用数组可以使用hashMap。而且这个id的取值可能不是0-n,因为在某一个时刻LRUCollection可能存在1,3,5三个page,那么怎样将pageId对应到数组角标呢?所以只能使用HashMap
    2. 当访问一个page时,要能将相应的Page放到集合的最前面以表示最近访问过。所以不仅要使用HashMap还得是LinkedHashMap。但是LinkedHashMap的遍历顺序是插入顺序,不是访问顺序,需要将accessOrder参数设置为true,变为访问顺序。

代码

package neu.lab.practice.base;

import java.util.*;

public class LRUCollection {
	public static void main(String[] args) {
		LRUCollection lru = new LRUCollection();
		String[] visits = {"1","2","3","4","1","2","5","1","2","3","4","5"};
		for(String visit:visits) {
			lru.get(visit);
		}
		System.out.println(lru.cnt);
	}
	private LRULinkedHashMap pages = new LRULinkedHashMap(3);
	private int cnt = 0;//记录缺页次数
	
	public Page get(String pageId) {
		Page p = pages.get(pageId);
		if(p==null) {
			cnt++;
			//此处的逻辑并不能统一,此处对应Page不存在的逻辑。如果是系统缺页则需要从硬盘中调出相应的页。
			//TODO
			p = new Page(pageId,"");
			pages.put(pageId, p);
		}
		return p;
	}

	public static class LRULinkedHashMap extends LinkedHashMap<String,Page> {
		private int capacity;

		public LRULinkedHashMap(int capacity) {
			//最后一个参数设置为true很重要!!!
			super(16, 0.75f, true);
			this.capacity = capacity;
		}

		@Override
		public boolean removeEldestEntry(Map.Entry<String,Page> eldest) {
			return size() > capacity;
		}
	}
	
	public static class Page {
		String id;
		String content;

		public Page(String id, String content) {
			super();
			this.id = id;
			this.content = content;
		}

		@Override
		public int hashCode() {
			final int prime = 31;
			int result = 1;
			result = prime * result + ((id == null) ? 0 : id.hashCode());
			return result;
		}

		@Override
		public boolean equals(Object obj) {
			if (this == obj)
				return true;
			if (obj == null)
				return false;
			if (getClass() != obj.getClass())
				return false;
			Page other = (Page) obj;
			if (id == null) {
				if (other.id != null)
					return false;
			} else if (!id.equals(other.id))
				return false;
			return true;
		}

	}

}

代码中的测试案例来源

https://www.cnblogs.com/RB26DETT/p/10035804.html

参考

https://www.cnblogs.com/keeya/p/9602691.html

https://www.cnblogs.com/zlting/p/10775887.html

标签:pageId,java,String,id,public,LRU,精简,return,Page
来源: https://blog.csdn.net/btb0815/article/details/96702196