android - java - 带有 ArrayList 的 WeakReferences?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/22555374/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
android - java - WeakReferences with an ArrayList?
提问by codingNewb
I know that with a WeakReference
, if I make a WeakReference
to something that unless there's a direct reference to it that it will be Garbage Collected with the next GC cycle. My question becomes, what if I make an ArrayList
of WeakReference
s?
我知道使用WeakReference
, 如果我WeakReference
对某些东西做 a ,除非有直接引用它,否则它将在下一个 GC 循环中被垃圾收集。我的问题变成了,如果我做一个ArrayList
of WeakReference
s 怎么办?
For example:
例如:
ArrayList<WeakReference<String>> exArrayList;
exArrayList = new ArrayList<WeakReference<String>>();
exArrayList.add(new WeakReference<String>("Hello"));
I can now access the data with exArrayList.get(0).get()
.
我现在可以使用exArrayList.get(0).get()
.
My question becomes: This is WeakReference
data, will the data located at exArrayList.get(0)
be GC'd with the next GC cycle? (even IF I don't make another direct reference to it) or will this particular reference stick around until the arraylist
is emptied? (eg: exArrayList.clear();
).
我的问题变成:这是WeakReference
数据,位于 的数据会exArrayList.get(0)
在下一个 GC 周期中被 GC 处理吗?(即使我没有直接引用它)或者这个特定的引用会一直存在直到arraylist
清空?(例如:)exArrayList.clear();
。
If this is a duplicate I haven't found it with my keywords in google.
如果这是重复的,我还没有在 google 中用我的关键字找到它。
采纳答案by Evgeniy Dorofeev
exArrayList.add(new WeakReference<String>("Hello"));
is a bad example becauseString
literals are never GC-edif it were e.g.
exArrayList.add(new WeakReference<Object>(new Object()));
then after a GC the object would be GC-ed, butexArrayList.get(0)
would still returnWeakReference
, thoughexArrayList.get(0).get()
would returnnull
exArrayList.add(new WeakReference<String>("Hello"));
是一个不好的例子,因为String
文字永远不会被垃圾回收如果是,
exArrayList.add(new WeakReference<Object>(new Object()));
那么在 GC 之后,对象将被 GC 处理,但exArrayList.get(0)
仍会返回WeakReference
,尽管exArrayList.get(0).get()
会返回null
回答by SJuan76
The data at exArrayList.get(0)
is the WeakReference
. It is not by itself a weak reference, so it will not be collected...
处的数据exArrayList.get(0)
是WeakReference
。它本身不是弱引用,因此不会被收集......
BUT the object referenced by exArrayList.get(0)
is weakly referenced, so it mightbe GCed at any time (of course, that requires that there are no strongreferences to that object).
但是被引用的对象exArrayList.get(0)
是弱引用的,所以它可能随时被GCed(当然,这要求没有对该对象的强引用)。
So
所以
data.get(0)
won't become null
, but data.get(0).get()
might become.
data.get(0)
不会变成null
,但data.get(0).get()
可能会变成。
In other words, the list does not references the weak referenced object but the weak reference itself.
换句话说,列表不引用弱引用对象,而是引用弱引用本身。
回答by Stefan Reich
This is a bad idea as the other posters explained above (reference objects not freed). Use a WeakHashMap with the objects as keys and some dummy values ("" or Boolean.TRUE or similar).
正如上面解释的其他海报一样,这是一个坏主意(参考对象未释放)。使用 WeakHashMap 将对象作为键和一些虚拟值("" 或 Boolean.TRUE 或类似的)。