Oracle Java教程-回答问题时可能出现错误

时间:2018-08-30 11:19:42

标签: java

我是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

  
      
  1. 问题:以下代码创建一个数组和一个字符串对象。   代码执行后,存在多少对这些对象的引用?是   哪个对象符合垃圾收集条件?

    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仍然引用它。

  2.   

3 个答案:

答案 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”的位置。