WeakReference与ArrayList?

我知道用WeakReference ,如果我做了一个WeakReference的东西,除非有直接的引用,它将被垃圾收集下一个GC周期。 我的问题是,如果我做一个WeakReferenceArrayList

例如:

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

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

我的问题变成:这是WeakReference数据,位于exArrayList.get(0)的数据将GC'd与下一个GC周期? (即使我不直接引用它),还是这个特定的参考会继续下去,直到arraylist被清空? (例如: exArrayList.clear(); )。

如果这是重复的,我还没有发现它与我的关键字在谷歌。

Solutions Collecting From Web of "WeakReference与ArrayList?"

  1. exArrayList.add(new WeakReference<String>("Hello")); 是一个不好的例子,因为String文字从不GC-ed

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

exArrayList.get(0)处的数据是WeakReference 。 它本身并不是一个弱点,所以它不会被收集。

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

所以

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

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

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