0

我在这里为一个概念而苦苦挣扎,而不是一段特定的代码。我觉得我被误导了,我正在努力解决这个问题。

这是一些示例代码:

List myList = new ArrayList<String>();

for (int i=1; i<11; i++) {
    Foo myObject = new Foo();
    myList.add(myObject.Bar)
}

有人告诉我,因为myList包含对它的全部引用,myObject.Bar所以在超出范围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 不是我的第一语言。

4

2 回答 2

5

我假设你的意思是这样的:

Foo myObject = new Foo();
myList.add(myObject.bar);

不,你被误导了。除非Foo.bar它本身包含对“拥有”的引用Foo(如果它真的只是一个字符串,它不会),它不会阻止你新创建的Foo实例被垃圾收集。如果您与误导您的人有个人联系,我建议您向他们询问更多详细信息。我可以看到三个选项之一:

  • 他们很可能误解了这种情况。
  • 情况可能与您描述的不太一样;例如,您可能正在谈论更多类似的内容:

    String longString = getLongString();
    myList.add(longString.substring(0, 4));
    

    ...此时是否可以对原始“大量字符数据”进行垃圾收集取决于实现。

  • 他们可能只是误解了垃圾收集,在这种情况下,您可以让他们更仔细地考虑它(并查看此答案和发布的任何其他答案),从而帮他们一个忙。
于 2013-03-07T05:41:11.767 回答
0

假设代码是正确的并且您打算这样做,在下面的代码中,在整个执行过程中,引用 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 循环结束后,对象才会超出范围并因此被垃圾回收。

于 2013-03-07T05:46:14.827 回答