在java中删除对象

Sri*_*aru 4 java

以下代码创建一个数组和一个字符串对象.

现在我的问题是

  1. 代码执行后,对这些对象有多少引用?
  2. 为什么?

这是我的代码

String[] students = new String[10];
String studentName = "Peter Smith";
students[0] = studentName;
studentName = null;
Run Code Online (Sandbox Code Playgroud)

我认为答案只是一个对象,students
但根据Oracle文档,Neither object is eligible for garbage collection

我应该如何推断答案?

The*_*kis 10

代码执行后,对这些对象有多少引用?

  • 一个参考a String[],可通过表达式获得students.
  • 一个参考a String,可通过表达式获得students[0].

为什么?

从本质上讲,答案是对象而不是变量可以有资格进行垃圾回收.

在您的情况下,您已将字符串(它是一个对象)的引用复制到数组的第一个插槽中.即使在您清除(设置为null)初始变量之后,仍然可以从您的代码中看到相同的对象,通过其他名称(以及"名称",这里我的意思是"表达式",如上所述).这就是字符串仍然不符合垃圾回收的原因.


为了比较,请考虑没有第三行的代码:

String[] students = new String[10];
String studentName = "Peter Smith";
studentName = null;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,字符串"Peter Smith"确实可以按照您的预期进行垃圾收集,因为任何表达式都无法获取它.


(以上所有内容都涉及Java语言,并且不考虑任何可能的JVM优化.)