android - java - 带有ArrayList的WeakReferences?

时间:2014-03-21 09:52:14

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

我知道使用WeakReference,如果我对WeakReference做了一些事情,除非直接引用它,否则将在下一个GC循环中收集垃圾。我的问题变成了,如果我ArrayList生成WeakReference怎么办?

例如:

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中找到我的关键字。

3 个答案:

答案 0 :(得分:24)

  1. exArrayList.add(new WeakReference<String>("Hello"));是一个糟糕的例子,因为String文字永远不会被GC编辑

  2. 如果是例如exArrayList.add(new WeakReference<Object>(new Object()));然后在GC之后,对象将被GC编辑,但exArrayList.get(0)仍将返回WeakReference,但exArrayList.get(0).get()将返回null

    < / LI>

答案 1 :(得分:7)

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

但是exArrayList.get(0)引用的对象被弱引用,因此可能可以随时进行GC操作(当然,这需要对该对象的引用。)

所以

data.get(0)不会成为null,但data.get(0).get()可能会成为。{/ p>

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

答案 2 :(得分:3)

这是一个坏主意,因为上面解释的其他海报(参考对象未被释放)。使用WeakHashMap将对象作为键和一些虚拟值(&#34;&#34;或Boolean.TRUE或类似值)。