我是Java新手,阅读Oracle教程.在每个部分之后,有问题和答案,我不理解一个答案中的句子(见下面的粗体线).
来源是https://docs.oracle.com/javase/tutorial/java/javaOO/QandE/objects-answers.html
我指的是问题2,看到粗体字.据我所知,如果没有对数组的引用,则数组有资格进行垃圾回收.无关紧要,是否存在对此数组所持有的对象的引用,因为内部对象(在数组内)具有自己的引用计数.是对的吗?请解释粗体句.
从oracle教程中引用:https://docs.oracle.com/javase/tutorial/java/javaOO/QandE/objects-answers.html
问题:以下代码创建一个数组和一个字符串对象.代码执行后,对这些对象有多少引用?对象是否有资格进行垃圾回收?
Run Code Online (Sandbox Code Playgroud)String[] students = new String[10]; String studentName = "Peter Smith"; students[0] = studentName; studentName = null;答:有一个对students数组的引用,该数组有一个对字符串Peter Smith的引用.这两个对象都没有资格进行垃圾回收.数组学生没有资格进行垃圾收集,因为它有一个对象studentName的引用,即使该对象已被赋值为null.该对象
studentName不符合条件,因为students[0]仍然引用它.
Max*_*mer 15
数组学生没有资格进行垃圾收集,因为它有一个对象studentName的引用,即使该对象已被赋值为null.
是的,那句话是......奇怪的.这没有道理.
无论对其他对象有什么引用,数组都可以进行垃圾收集.
students是对数组的引用,因此只要students保留在范围内,它就不符合垃圾回收的条件.
dav*_*xxx 14
这两个对象都没有资格进行垃圾回收.
这是正确的.
但解释不清楚:
该
array学生不符合垃圾收集,因为它有一个参考对象studentName,即使该对象已被分配的值null.
studentName不是一个对象,它是一个变量.
此外,null阵列中的元素不会影响GC的阵列合格性,但它只具有数组元素的GC合格性.
例如 :
String[] students = new String[10];
// the object referenced by students is not eligible to be GC
Run Code Online (Sandbox Code Playgroud)
要么 :
String[] students = new String[10];
String studentName = "Peter Smith";
students[0] = studentName;
students[0] = null;
// no object is eligible to be GC
Run Code Online (Sandbox Code Playgroud)
一个正确的句子可能是:
该String对象不符合垃圾收集的条件,因为该studentName变量先前引用的对象仍然被数组引用,并且将新对象分配studentName给变量(如分配给null)仅更改此变量的引用,而不更改引用该变量的引用.同一个对象.
请注意,数组不会像Java使用对象分配那样改变任何方式.
有了List你可以看到相同的行为.
例如 :
String a = "Peter";
List<String> list = ...
list.add(a);
a = null;
Run Code Online (Sandbox Code Playgroud)
出于同样的原因,没有对象有资格成为GC.
| 归档时间: |
|
| 查看次数: |
1164 次 |
| 最近记录: |