2013-08-20 3 views
1

Я хочу построить быстрый кеш LRU. Является ли такое решение хорошим способом сделать это? А как насчет синхронизации?LRU лучший способ выполнить быструю реализацию в java

Существует защищенный метод, называемый removeEldestEntry. Этот метод вызывается, когда элементы добавляются к карте. Реализация по умолчанию возвращает false. Но я могу подклассировать LinkedHashMap и переопределить этот метод, чтобы проверить, достигнут ли максимальный размер, а затем просто вернуть true. LinkedHashMap найдет самую старую запись через связанный список и загрузите ее перед добавлением новой записи.

public class MyLRUMap<K,V> extends LinkedHashMap<K,V> { 
private int maxCapacity; 

public MyLRUMap(int initialCapacity, float loadFactor, int maxCapacity) { 
super(initialCapacity, loadFactor, true); 
this.maxCapacity = maxCapacity; 
} 

@Override 
protected boolean removeEldestEntry(Entry<K,V> eldest) { 
return size() >= this.maxCapacity; 
} 
} 

Благодаря

ответ

2

Это рекомендуемый способ сделать это, хотя это могло бы быть лучше, чтобы сделать size() > this.maxCapacity вместо >=

+1

Это b ecause метод removeEldest вызывается после того, как вставлен новый элемент? Если i do> =, моя карта будет поддерживать maxCapacity -1 как размер? –

+1

Правильно, в соответствии с Javadoc, removeEldest называется AFTER put() и putAll() – dkatzel

0

Эта реализация упоминается в книге «Java дженериков и Коллекции» here

2

Я хотел бы рекомендовать guava/cachebuilder для этого