Существует ли LinkedHashMap на основе программных ссылок в Java? Если нет, есть ли у кого-нибудь фрагмент кода, который я, вероятно, смогу использовать повторно? Я обещаю ссылаться на него правильно.
Спасибо.
Существует ли LinkedHashMap на основе программных ссылок в Java? Если нет, есть ли у кого-нибудь фрагмент кода, который я, вероятно, смогу использовать повторно? Я обещаю ссылаться на него правильно.
Спасибо.
WeakHashMap не сохраняет порядок вставки. Таким образом, его нельзя рассматривать как прямую замену LinkedHashMap. Кроме того, запись карты освобождается только тогда, когда ключ больше недоступен. Что может быть не тем, что вы ищете.
Если вы ищете удобный для памяти кеш, вот наивная реализация, которую вы могли бы использовать.
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;
}
}
Лучшая идея, которую я видел для этого, - это обернуть LinkedHashMap
так, чтобы все, что вы put
в него вложили, было WeakReference.
ОБНОВЛЕНИЕ: только что просмотрел исходный код WeakHashMap
, и то, как он справляется с преобразованием всего в WeakReference
, при этом все еще хорошо играя с дженериками, является надежным. Вот сигнатура основного класса, которую он использует:
private static class Entry<K,V> extends WeakReference<Object> implements Map.Entry<K,V>
Я предлагаю более подробно просмотреть источник для других идеи реализации.
ОБНОВЛЕНИЕ 2: kdgregory поднимает хороший вопрос в своем комментарии - все, что я предлагаю, это убедиться, что ссылки в Map
не будут препятствовать сборке мусора референта. Вам все еще нужно очистить мертвые ссылки вручную.
взгляните на этот пост. Он показывает, как реализовать SoftHashMap...