Мягкая ссылка LinkedHashMap в Java? - PullRequest
4 голосов
/ 14 мая 2009

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

Спасибо.

Ответы [ 3 ]

6 голосов
/ 14 мая 2009

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;
    }
}
3 голосов
/ 14 мая 2009

Лучшая идея, которую я видел для этого, это обернуть LinkedHashMap, чтобы все, что вы put включили в него, было Слабая ссылка .

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

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

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

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

2 голосов
/ 14 мая 2009

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

...