WeakHashMap does not preserve the insertion order. Thus, this cannot be considered as a direct replacement for LinkedHashMap. In addition, the record on the card is displayed only when the key no longer available. Perhaps this is not what you are looking for.
If you are looking for a cache that is convenient for storing data, here is a naive implementation that you could use.
package be.citobi.oneshot; import java.lang.ref.SoftReference; import java.util.LinkedHashMap; public class SoftLinkedCache<K, V> { private static final long serialVersionUID = -4585400640420886743L; private final LinkedHashMap<K, SoftReference<V>> map; public SoftLinkedCache(final int cacheSize) { if (cacheSize < 1) throw new IllegalArgumentException("cache size must be greater than 0"); map = new LinkedHashMap<K, SoftReference<V>>() { private static final long serialVersionUID = 5857390063785416719L; @Override protected boolean removeEldestEntry(java.util.Map.Entry<K, SoftReference<V>> eldest) { return size() > cacheSize; } }; } public synchronized V put(K key, V value) { SoftReference<V> previousValueReference = map.put(key, new SoftReference<V>(value)); return previousValueReference != null ? previousValueReference.get() : null; } public synchronized V get(K key) { SoftReference<V> valueReference = map.get(key); return valueReference != null ? valueReference.get() : null; } }
source share