Мягкая ссылка LinkedHashMap в Java?

Существует ли в Java LinkedHashMap на основе программных ссылок? Если нет, есть ли у кого-нибудь фрагмент кода, который я могу использовать повторно? Я обещаю ссылаться на это правильно.

Благодарю.

3 ответа

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 в это слабая ссылка.

ОБНОВЛЕНИЕ: Просто просмотрел источник WeakHashMap и как он справляется, делая все WeakReference в то время как все еще хорошо играть с дженериками солидно. Вот сигнатура базового класса, которую он использует:

private static class Entry<K,V> extends WeakReference<Object> implements Map.Entry<K,V>

Я предлагаю рассмотреть источник более подробно для других идей реализации.

ОБНОВЛЕНИЕ 2: kdgregory поднимает хорошую мысль в своем комментарии - все, что я предлагаю, это убедиться, что ссылки в Map не будет удерживать референта от сбора мусора. Вам все еще нужно вычистить мертвые ссылки вручную.

Посмотрите на этот пост. Он показывает, как реализовать SoftHashMap...

Другие вопросы по тегам