android – java – 带有ArrayList的WeakReferences?

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

例如:

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

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

我的问题变成:这是WeakReference数据,位于exArrayList.get(0)的数据是否会在下一个GC周期进行GC? (即使我没有另外直接引用它),或者这个特定的参考文件是否会一直存在,直到arraylist被清空为止? (例如: exArrayList.clear(); )。

如果这是重复的,我还没有在谷歌中find我的关键字。

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

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

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

但是exArrayList.get(0)引用的对象被弱引用,因此它可能在任何时候被GCed(当然,这要求对该对象没有引用)。

所以

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

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

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