为什么此String不符合垃圾回收的条件?

时间:2016-09-08 06:52:07

标签: java string

以下代码创建一个数组和一个字符串对象。代码执行后,对这些对象有多少引用?这两个对象是否有资格进行垃圾收集?

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

我的回答是studentName有资格进行垃圾收集。但是给出的答案都不符合条件。我认为学生[0]是指String" Peter Parker"而studentName也是一样的。现在studentName引用null,学生[0]仍然指的是" Peter Parker" (我通过打印来检查这个。)给出的解释是学生[0]仍然指的是studentName所以studentName也没有资格进行垃圾收集。但是我不理解这个,因为studentName现在指的是null和学生[0]指的是彼得帕克"。我的理解错了吗?

3 个答案:

答案 0 :(得分:6)

studentName = null;执行之前,studentNamestudents[0]都持有对同一String对象(其值为"Peter Parker")的引用。当您将null分配给studentName时,students[0]仍会引用该对象,因此无法对其进行垃圾回收。

Java没有垃圾收集引用变量,一旦没有对这些变量的引用,它就会收集这些变量所引用的对象。

答案 1 :(得分:3)

此处使用"Peter Parker"studentName创建String对象  只是提到它。 Java将垃圾收集那些对象  迷路了,没有参考,这里你很困惑参考  studentName。通过将null分配给studentName,您只需删除即可  "Peter Parker"的一个参考;但它仍然由数组元素引用,  所以它不会被垃圾收集。

答案 2 :(得分:3)

你有多少个物品?

您有两个对象:

  • 字符串"Peter Parker"
  • 字符串数组。

这些对象有多少引用?

三个引用:

  • 变量studentName正在引用字符串对象。
  • 变量students正在引用数组对象。
  • 数组对象的第一个位置students[0]也引用了字符串对象。

代码执行后对这些对象的引用数量是多少?

执行此行后:

studentName = null;

仅删除了三个引用中的第一个。我们仍然有两个引用。

这两个对象是否有资格进行垃圾回收?

,因为:

  • 数组对象仍由students变量引用。
  • 字符串对象"Peter parker"仍由数组对象students[0]的第一个位置引用。

由于两个对象仍然在某处被引用,因此它们都不符合垃圾回收的条件。

PS:我使用过通用"字符串"和"阵列"有目的的对象的术语,因此更容易在心理上将它们与代码中的实际String和String []变量分离。