[英]If I populate a list with object fields, can my object be garbage collected while the list remains in scope?
我在这里为一个概念而苦苦挣扎,而不是真正的一段代码。 我觉得自己被误导了,我正在努力使自己陷入困境。
这是一些示例代码:
List myList = new ArrayList<String>();
for (int i=1; i<11; i++) {
Foo myObject = new Foo();
myList.add(myObject.Bar)
}
有人告诉我,因为myList
包含对myObject.Bar
的引用,所以直到myList
超出范围,整个myObject
才符合GC的myList
。 有人告诉我是否
List myList = new ArrayList<String>();
for (int i=1; i<11; i++) {
Foo myObject = new Foo();
myList.add(new String(myObject.Bar))
}
相反, myObject
可以使用GC,因为它没有被“强引用”。
但这似乎不正确,有人可以向我解释吗?
随意更正我的术语,Java不是我的第一语言。
我认为您的意思确实是这样的:
Foo myObject = new Foo();
myList.add(myObject.bar);
不,您被误导了。 除非Foo.bar
本身包含对“拥有的” Foo
的引用(如果它实际上只是一个字符串,则不会),它将不会阻止您新创建的Foo
实例被垃圾回收。 如果您亲自与误导您的人联系,建议您向他们询问更多详细信息。 我可以看到以下三个选项之一:
情况可能不像您描述的那样。 例如,您可能在谈论更多类似的内容:
String longString = getLongString(); myList.add(longString.substring(0, 4));
...在那时,是否可以垃圾回收原始的“大量字符数据”取决于实现。
假定代码正确无误,并且您打算这样做,则在下面的代码中,在整个执行过程中,引用myObject未设置为null,因此该对象不会丢失。 因此它不能被垃圾收集。
List myList = new ArrayList<String>();
for (int i=1; i<11; i++) {
Foo myObject = new Foo();
myList.add(new String(Foo.Bar))
}
仅在For循环结束之后,对象才超出范围,因此成为垃圾回收。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.