代码之家  ›  专栏  ›  技术社区  ›  Eliyahu Machluf

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

  •  18
  • Eliyahu Machluf  · 技术社区  · 7 年前

    我是Java新手,正在阅读Oracle教程。 在每一节之后,都有问题和答案,我不理解一个答案中的一个句子(见下面粗体的一行)。

    https://docs.oracle.com/javase/tutorial/java/javaOO/QandE/objects-answers.html

    1. 问题:下面的代码创建一个数组和一个字符串对象。 代码执行后,存在多少对这些对象的引用?是

      String[] students = new String[10];
      String studentName = "Peter Smith";
      students[0] = studentName;
      studentName = null;
      

      答:有一个对students数组和那个数组的引用 有一个是关于彼得·史密斯的。两个物体都不是 有资格进行垃圾收集。 阵列学生不合格 无效的 . 对象 studentName 也不符合条件,因为 students[0] 仍然提到它。

    3 回复  |  直到 7 年前
        1
  •  15
  •   Max Vollmer    7 年前

    数组students没有资格进行垃圾收集,因为它有一个对对象studentName的引用,即使该对象已被赋值为null。

    是的,那句话是。。。奇怪。这毫无意义。

    数组可以进行垃圾收集,而不管它对其他对象有什么引用。

    students 是对数组的引用,因此只要 学生 仍在范围内。

        2
  •  14
  •   davidxxx    7 年前

    两个对象都不符合垃圾收集的条件。

    这是对的。

    但解释并不清楚:

    这个 array studentName 即使那个物体 null

    学生姓名 不是对象,而是变量。

    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 对象没有资格进行垃圾回收,因为 学生姓名 变量仍由数组引用,并将新对象指定给变量(如指定的 学生姓名 )只更改此变量的引用,而不更改引用同一对象的这些变量的引用。


    注意,数组并没有改变Java处理对象分配的方式。
    List 你可以注意到同样的行为。
    例如:

    String a = "Peter";
    List<String> list = ...
    list.add(a);
    a = null;
    

    由于同样的原因,没有对象有资格成为GC。

        3
  •  -5
  •   Faraz    7 年前

    这一切都与字符串是不可变的有关,这意味着一旦创建,它们就不能更改。所以当你这么做的时候,

    String studentName = "Peter Smith";
    

    studentName = null,
    

    StudentName现在指向另一个指向null的内存地址。““彼得·史密斯”仍在记忆中的某个地方。