我知道使用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中找到我的关键字。
答案 0 :(得分:24)
exArrayList.add(new WeakReference<String>("Hello"));
是一个糟糕的例子,因为String
文字永远不会被GC编辑
如果是例如exArrayList.add(new WeakReference<Object>(new Object()));
然后在GC之后,对象将被GC编辑,但exArrayList.get(0)
仍将返回WeakReference
,但exArrayList.get(0).get()
将返回null
答案 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或类似值)。