1

问:02 鉴于:

11. public void genNumbers() {
12.    ArrayList numbers = new ArrayList();
13.    for (int i=0; i<10; i++) {
14.       int value = i * ((int) Math.random());
15.       Integer intObj = new Integer(value);
16.       numbers.add(intObj);
17.    }
18.    System.out.println(numbers);
19. }

哪一行代码标志着 intObj 引用的对象成为垃圾回收候选对象的最早点?

A. Line 16
B. Line 17
C. Line 18
D. Line 19
E. The object is NOT a candidate for garbage collection.

答案:D

困惑为什么答案是D而不是B。请帮助我理解。

4

4 回答 4

8

您可能认为由于变量的生命周期在块的末尾结束,因此垃圾收集器可以删除对象。但由于该对象已添加到 list numbers,它仍然被引用。因此,它在结束的生命周期之后,numbers并且列表也可以被垃圾收集器删除。

于 2013-07-11T11:29:32.920 回答
1

在第 17 行,变量intObj超出了范围,但这仅意味着对 Integer 对象的引用比以前少了一个。numbers数组仍然引用与之前相同的对象,因此在超出范围intObj之前无法收集它。numbers

于 2013-07-11T11:36:03.783 回答
1

仅当任何引用都无法访问该对象 ID 时才会进行垃圾回收。但在我们的示例中是 new Integer(value); 变得无法访问 tointObj 但它被 arraylist 访问所以我们仍然访问新的 Integer(value); 所以只有当 arraylist 超出范围时它才会被垃圾收集。

于 2013-09-20T05:12:00.217 回答
0

该对象intObj在第 15 行创建,并在第 16 行添加对它的引用numbers。虽然intObj在第 17 行超出范围,但它仍然由 引用numbers,直到第 19 行才超出范围。

于 2013-07-11T11:36:37.613 回答