前文写到Go和Python实现LRU算法及LRU算法的相关讨论,本文讲述使用Java实现LRU算法。Java自带的集合框架非常强大,实现LRU算法可以直接使用LinkedHashMap集合框架。关于LRU算法的原理见Go实现LRU算法 ,Python实现的LRU算法见LRU算法的实现(Python版)。
实现
首先我们谈谈LinkedHashMap。它的一个构造函数如下:
public LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder)
第一第二个参数好明白,第三个参数accessOrder,如果传入false,那么它就是一个单纯的FIFO队列,映射顺序就是插入顺序。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| import java.util.LinkedHashMap; import java.util.Map.Entry;
public class LRUCache extends LinkedHashMap { private static final long serialVersionUID = 1L; private final int capacity; private long accessCount = 0; private long hitCount = 0;
public LRUCache(int capacity) { super(capacity+1, 1.1f, true); this.capacity = capacity; }
public String get(String key) { accessCount++; if (super.containsKey(key)) { hitCount++; } String value = (String)super.get(key); return value; } public boolean containsKey(String key) { accessCount++; if (super.containsKey(key)) { hitCount++; return true; } else { return false; } }
protected boolean removeEldestEntry(Entry eldest) { return size() > capacity; }
public long getAccessCount() { return accessCount; }
public long getHitCount() { return hitCount; } }
|
比起Go、Python,Java实现LRU算法代码量更少,因为直接使用JDK内置库LinkedHashMap。
完。