Soft reference LinkedHashMap in Java?

前端 未结 3 1949
误落风尘
误落风尘 2021-02-10 16:49

Is there softreference-based LinkedHashMap in Java? If no, has anyone got a snippet of code that I can probably reuse? I promise to reference it correctly.

Thanks.

3条回答
  •  Happy的楠姐
    2021-02-10 17:19

    WeakHashMap doesn't preserve the insertion order. It thus cannot be considered as a direct replacement for LinkedHashMap. Moreover, the map entry is only released when the key is no longer reachable. Which may not be what you are looking for.

    If what you are looking for is a memory-friendly cache, here is a naive implementation you could use.

    package be.citobi.oneshot;
    
    import java.lang.ref.SoftReference;
    import java.util.LinkedHashMap;
    
    public class SoftLinkedCache
    {
        private static final long serialVersionUID = -4585400640420886743L;
    
        private final LinkedHashMap> map;
    
        public SoftLinkedCache(final int cacheSize)
        {
            if (cacheSize < 1)
                throw new IllegalArgumentException("cache size must be greater than 0");
    
            map = new LinkedHashMap>()
            {
                private static final long serialVersionUID = 5857390063785416719L;
    
                @Override
                protected boolean removeEldestEntry(java.util.Map.Entry> eldest)
                {
                    return size() > cacheSize;
                }
            };
        }
    
        public synchronized V put(K key, V value)
        {
            SoftReference previousValueReference = map.put(key, new SoftReference(value));
            return previousValueReference != null ? previousValueReference.get() : null;
        }
    
        public synchronized V get(K key)
        {
            SoftReference valueReference = map.get(key);
            return valueReference != null ? valueReference.get() : null;
        }
    }
    

提交回复
热议问题