我是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
问题:以下代码创建一个数组和一个字符串对象。 代码执行后,存在多少对这些对象的引用?是 哪个对象符合垃圾收集条件?
export default { user: { login: (credentials) => axios.post('http://10.0.0.103:3000/auth', {credentials}) .then(user => user.data.credentials) } }
答案:有一个对学生数组的引用,并且该数组 有一个对字符串Peter Smith的引用。两者都不是 有资格进行垃圾收集。 数组学生不符合条件 用于垃圾回收,因为它对对象有一个引用 即使已为该对象分配了值,该名称仍为studentName 空。对象
String[] students = new String[10]; String studentName = "Peter Smith"; students[0] = studentName; studentName = null;
不符合条件,因为studentName
仍然引用它。
答案 0 :(得分:15)
学生数组不符合垃圾收集的条件,因为即使该对象被分配了null值,它也具有对对象StudentName的一个引用。
是的,那句话很奇怪。没道理。
无论对其他对象的引用如何,数组都可以进行垃圾回收。
students
是对数组的引用,因此只要students
仍在作用域内,就不符合垃圾回收的条件。
答案 1 :(得分:14)
这两个对象都不能进行垃圾收集。
是的。
但是解释不清楚:
array
名学生不符合垃圾收集条件,因为它可以 对对象studentName
有一个引用,即使该对象 已分配了值null
。
studentName
不是对象,而是变量。
此外,数组中的null
元素不会影响要成为GC的数组资格,而只会影响数组元素的GC资格。
例如:
String[] students = new String[10];
// the object referenced by students is not eligible to be GC
或:
String[] students = new String[10];
String studentName = "Peter Smith";
students[0] = studentName;
students[0] = null;
// no object is eligible to be GC
正确的句子可能是:
String
对象不适合进行垃圾回收,因为先前由studentName
变量引用的对象仍被数组引用,并为变量分配了新对象(已分配{{1} }至studentName
)仅更改此变量的引用,而不更改引用同一对象的变量的引用。
请注意,数组不会像Java处理对象分配的方式一样发生任何变化。
使用null
,您可能会注意到相同的行为。
例如:
List
出于相同的原因,没有任何对象有资格成为GC。
答案 2 :(得分:-5)
这与字符串不可变有关,这意味着一旦创建,就不能更改它们。因此,当您这样做时,
String studentName = "Peter Smith";
然后您执行此操作
studentName = null,
studnentName现在指向另一个指向null的内存地址。 “彼得·史密斯”仍在记忆中。
在将值“彼得·史密斯”分配给student [0]之后,即使将studentName设置为null,student [0]仍保留该值。因为Student [0]引用了内存中保存“ Peter Smith”的位置。