LRU缓存算法实现

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;

public class LRUCache {
	private long lookups;
	private long hits;
	private long inserts;
	private long evictions;

	private Map map;

	public void init(int initialSize, final int limitSize) {

		map = new LinkedHashMap(initialSize, 0.75f, true) {
			protected boolean removeEldestEntry(Map.Entry eldest) {
				if (size() > limitSize) {
					evictions++;
					return true;
				}
				return false;
			}
		};

	}

	public int size() {
		synchronized (map) {
			return map.size();
		}
	}

	public Object put(Object key, Object value) {
		synchronized (map) {
			inserts++;
			return map.put(key, value);
		}
	}

	public Object get(Object key) {
		synchronized (map) {
			Object val = map.get(key);
			lookups++;
			if (val != null) {
				hits++;
			}
			return val;
		}
	}

	public void clear() {
		synchronized (map) {
			map.clear();
		}
	}


	private static String calcHitRatio(long lookups, long hits) {
	    if (lookups==0) return "0.00";
	    if (lookups==hits) return "1.00";
	    int hundredths = (int)(hits*100/lookups);   // rounded down
	    if (hundredths < 10) return "0.0" + hundredths;
	    return "0." + hundredths;
	}
	
	public Map getStatistics(){
	    Map statMap = new HashMap();
	    synchronized (map) {
	      statMap.put("lookups", lookups);
	      statMap.put("hits", hits);
	      statMap.put("hitratio", calcHitRatio(lookups,hits));
	      statMap.put("inserts", inserts);
	      statMap.put("evictions", evictions);
	      statMap.put("size", map.size());
	    }
	    return statMap;
	}
}

相关推荐