Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
此Java代码中有多少对象符合垃圾收集条件?_Java_Collections_Garbage Collection_Garbage - Fatal编程技术网

此Java代码中有多少对象符合垃圾收集条件?

此Java代码中有多少对象符合垃圾收集条件?,java,collections,garbage-collection,garbage,Java,Collections,Garbage Collection,Garbage,根据我正在读的书,这里的答案显然是2,但我仍然不明白为什么。它说在“//do stuff”行之后,2个对象将符合GC的条件 有人能一步一步地给我解释一下吗?在代码中的某一行之后,知道有多少对象符合垃圾收集的条件,这像是一个技巧吗?因为我们被告知这些类型的问题(有多少是gc可省略的)将出现在测试中 class CardBoard { Short story = 200; CardBoard go(CardBoard cb) { cb = null;

根据我正在读的书,这里的答案显然是2,但我仍然不明白为什么。它说在“//do stuff”行之后,2个对象将符合GC的条件

有人能一步一步地给我解释一下吗?在代码中的某一行之后,知道有多少对象符合垃圾收集的条件,这像是一个技巧吗?因为我们被告知这些类型的问题(有多少是gc可省略的)将出现在测试中

class CardBoard {  
   Short story = 200;  
   CardBoard go(CardBoard cb) {    
      cb = null;    
      return cb;  
   }  

   public static void main(String[] args) {    
      CardBoard c1 = new CardBoard();    
      CardBoard c2 = new CardBoard();    
      CardBoard c3 = c1.go(c2);    
      c1 = null;    
      // do Stuff 
   } 
}
是的,答案是“在“//do stuff”行之后,有两个对象可以用于垃圾收集,但我仍然不明白为什么


在这张图片中,它也说明了为什么答案是2,但是解释让我更加困惑

它甚至不能解释其他物体发生了什么


编辑:

所以根据你们的说法,C1和C3符合GC的条件,我可以理解为什么C1被设置为null,而C1.GO(C2)将null返回给C3


但是根据这本书,只有C1是合格的,答案是2,因为包装很短。我不知道这是为什么,甚至不知道什么是短包装器对象。

c2仍然在引用carboard对象。c1被设置为null,当我们调用c1.go(c2)时,c3引用的是null。
因此,它们(c1和c3)都不再在内存中引用,并且符合垃圾收集的条件。

我已经运行并调试了代码,我可以看到c1和c3都为空(出于明显的原因),而c2才是空的!=空


这是因为Java中的对象是通过value()传递的,在方法中设置c2=null不会导致原始c2设置为null。

我认为正确的答案实际上是只有一个对象符合“//do stuff”行之后的垃圾收集条件

在该代码中,只创建了两个对象,然后c1和c2引用它们。在“c1=null”行之后,一个对象立即成为GC的合格对象,尽管第二个对象仍然可以通过c2 ref访问

更新:


我错过了一个细节-每次调用
newcardboard()
都会创建两个对象,因此调用
c1=null
会生成符合条件的CardBoard和他为GC嵌套的短成员

,但c3应该设置为null,因为c1.go(c2)返回null,对吗?很抱歉,是的,你是对的,我标记错误。这就是我刚才想要键入的内容:)c2没有设置为null,go()的
cb
参数设置为null,但为什么它只说c1为null加上短包装器呢?我仍然很困惑。c1是空的,因为最终空被分配给c1;c3为null,因为c1.go(c2)将null返回给c3;c2不为null,因为对其对象的c2引用被传递给go()函数中的参数cb,但c2本身并没有赋值给null,而只赋值给go()函数中的参数cb;我同意你的观点,我忽略了只有两个硬纸板对象被实例化,c3=c1。go(c2)不会实例化任何新对象。因此,在本例中,当到达//dostuff时,c1==null,因此它将可用于垃圾收集(这是一个对象),这意味着c1中的Short story=200将可用于垃圾收集(这是第二个对象)。实际上,我也错了。这里有正确的解释@Alexey哇,我不知道这个纸板问题已经被问过了。很抱歉我不知道如何检查一个已经被询问过的完整代码。
Short
成员可能有资格也可能没有资格获得GC。所以正确的答案是我们不知道。实际上,在
//do stuff
之后,所有对象都符合GC的条件。