public class LRUCache<K, V> extends LinkedHashMap<K, V> implements Iterable {
private static final Logger LOGGER = Logger.getLogger(LRUCache.class.getName());
private final int maxSize;
public LRUCache(int maxSize) {
super(maxSize, 0.75f, true);
this.maxSize = maxSize;
}
@Override
protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
boolean remove = size() > maxSize;
if (remove) {
LOGGER.info("Evicted entry: " + eldest);
}
return remove;
}
@Override
public Iterator<V> iterator() {
return new LRUCacheIterator();
}
private class LRUCacheIterator implements Iterator<V> {
private final java.util.Iterator<Map.Entry<K, V>> iterator = LRUCache.this.entrySet().iterator();
@Override
public boolean hasNext() {
return iterator.hasNext();
}
@Override
public V next() {
if (!hasNext()) {
throw new java.util.NoSuchElementException();
}
return iterator.next().getValue();
}
}
public static void main(String[] args) {
LRUCache<String, Integer> lruCache = new LRUCache<>(3);
lruCache.put("one", 1);
lruCache.put("two", 2);
lruCache.put("three", 3);
System.out.println("Cache content after initial insertion:");
for (Integer value : lruCache) {
System.out.println(value);
}
// Adding more elements to trigger eviction
lruCache.put("four", 4);
lruCache.put("five", 5);
System.out.println("Cache content after eviction:");
for (Integer value : lruCache) {
System.out.println(value);
}
}
import java.util.LinkedHashMap; import java.util.Map; import java.util.logging.Logger;
public class LRUCache<K, V> extends LinkedHashMap<K, V> implements Iterable {
private static final Logger LOGGER = Logger.getLogger(LRUCache.class.getName());
private final int maxSize;
}