Tôi đã cố gắng triển khai bộ nhớ cache LRU bằng LinkedHashMap. Trong tài liệu của LinkedHashMap (http://docs.oracle.com/javase/7/docs/api/java/util/LinkedHashMap.html), nó nói:Sử dụng LinkedHashMap để triển khai bộ nhớ cache LRU
Lưu ý rằng thứ tự chèn không bị ảnh hưởng nếu khóa được chèn lại vào bản đồ.
Nhưng khi tôi làm puts sau
public class LRUCache<K, V> extends LinkedHashMap<K, V> {
private int size;
public static void main(String[] args) {
LRUCache<Integer, Integer> cache = LRUCache.newInstance(2);
cache.put(1, 1);
cache.put(2, 2);
cache.put(1, 1);
cache.put(3, 3);
System.out.println(cache);
}
private LRUCache(int size) {
super(size, 0.75f, true);
this.size = size;
}
@Override
protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
return size() > size;
}
public static <K, V> LRUCache<K, V> newInstance(int size) {
return new LRUCache<K, V>(size);
}
}
Đầu ra là
{1=1, 3=3}
nào chỉ ra rằng việc tái chèn đã ảnh hưởng đến trật tự. Có ai biết giải thích nào không?
Tôi tự hỏi, bạn đang làm điều đó cho một mục đích cụ thể? Bởi vì Java đã cung cấp một 'WeakHashMap' cung cấp chức năng này. https://docs.oracle.com/javase/7/docs/api/java/util/WeakHashMap.html – Jack
Nếu đơn đặt hàng sẽ không bị ảnh hưởng bởi việc chèn lại. Thứ tự phải là {2 = 2, 3 = 3}, vì {1 = 1} được thêm trước và được chèn lại. –
@Jack 'WeakHashMap' không làm những gì bạn [nghĩ] (https://stackoverflow.com/questions/5511279/what-is-a-weakhashmap-and-when-to-use-it). Nó không giống với [bộ nhớ cache LRU] (https://en.wikipedia.org/wiki/Cache_algorithms#Examples). – Jeffrey