【问题标题】:android - java - WeakReferences with an ArrayList?android - java - 带有 ArrayList 的 WeakReferences?
【发布时间】:2014-04-28 14:53:35
【问题描述】:

我知道使用WeakReference,如果我对某个东西创建WeakReference,除非直接引用它,否则它将在下一个 GC 循环中被垃圾收集。我的问题变成了,如果我将ArrayList 设为WeakReferences 会怎样?

例如:

ArrayList<WeakReference<String>> exArrayList;
exArrayList = new ArrayList<WeakReference<String>>();
exArrayList.add(new WeakReference<String>("Hello"));

我现在可以使用exArrayList.get(0).get() 访问数据。

我的问题变成:这是WeakReference 数据,位于exArrayList.get(0) 的数据会在下一个GC 循环中被GC 吗? (即使我没有直接引用它)或者这个特定的引用会一直存在直到arraylist 被清空? (例如:exArrayList.clear();)。

如果这是重复的,我在 google 中没有用我的关键字找到它。

【问题讨论】:

    标签: java android arraylist garbage-collection weak-references


    【解决方案1】:
    1. exArrayList.add(new WeakReference&lt;String&gt;("Hello")); 是一个不好的例子,因为 String 文字永远不会被 GC 处理

    2. 如果是,例如exArrayList.add(new WeakReference&lt;Object&gt;(new Object())); 然后在 GC 之后对象将被 GC-ed,但 exArrayList.get(0) 仍将返回 WeakReference,尽管 exArrayList.get(0).get() 将返回 null

    【讨论】:

      【解决方案2】:

      exArrayList.get(0) 的数据是WeakReference。它本身不是弱引用,所以不会被收集...

      但是exArrayList.get(0) 引用的对象是弱引用的,所以它可能随时被 GC(当然,这要求没有 strong 引用那个对象)。

      所以

      data.get(0) 不会变成 null,但 data.get(0).get() 可能会变成。

      换句话说,列表不引用弱引用对象,而是引用弱引用本身。

      【讨论】:

        【解决方案3】:

        与上面解释的其他海报一样,这是一个坏主意(未释放参考对象)。使用 Wea​​kHashMap,将对象作为键和一些虚拟值(“”或 Boolean.TRUE 或类似)。

        【讨论】:

        • 我认为“未释放的引用对象”比您并不真正需要它的 HashMap 的巨大开销要少。
        • 我有时会使用 List> 因为缺少 LinkedWeakHashMap。只需确保有时清理列表即可。
        • HashMap 没有那么多开销。这里的要点是,它的开销是一个固定因素,而 List 方法可以无限增长,即使其中实际上不再有对象。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-05-02
        • 1970-01-01
        • 1970-01-01
        • 2012-10-09
        • 1970-01-01
        • 2016-10-02
        • 2012-03-25
        相关资源
        最近更新 更多