Java中软引用LinkedHashMap?

发布于 2024-07-20 07:21:04 字数 83 浏览 8 评论 0原文

Java中有基于软引用的LinkedHashMap吗? 如果没有,有人有一段我可以重用的代码吗? 我保证正确引用它。

谢谢。

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.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

超可爱的懒熊 2024-07-27 07:21:04

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;
    }
}

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<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;
    }
}
╭ゆ眷念 2024-07-27 07:21:04

我见过的最好的想法是包装 LinkedHashMap ,以便您放入其中的所有内容都是 弱引用

更新:刚刚浏览了 WeakHashMap 的源代码,以及它处理使所有内容成为 WeakReference 同时仍能很好地使用泛型的方式是可靠的。 这是它使用的核心类签名:

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

我建议浏览 源代码< /a> 更深入地了解其他实现想法。

更新 2:kdgregory 在他的评论中提出了一个很好的观点 - 我的所有建议都是确保 Map 中的引用不会阻止所指对象被垃圾收集。 您仍然需要手动清除死引用。

The best idea I've seen for this is wrapping LinkedHashMap so that everything you put into it is a WeakReference.

UPDATE: Just browsed the source of WeakHashMap and the way it handles making everything a WeakReference while still playing nice with generics is solid. Here's the core class signature it uses:

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

I suggest browsing the source more in depth for other implementation ideas.

UPDATE 2: kdgregory raises a good point in his comment - all my suggestion does is make sure the references in the Map won't keep the referent from being garbage-collected. You still need to clean out the dead references manually.

倥絔 2024-07-27 07:21:04

看看这篇文章。 它展示了如何实现 SoftHashMap...

have a look at this post. It shows how to implement a SoftHashMap...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文