繁体   English   中英

如果我用对象字段填充列表,那么当列表仍在作用域内时,是否可以对我的对象进行垃圾回收?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM