当前位置: 首页 > 知识库问答 >
问题:

OracleJava教程-回答问题时可能出现的错误

郑博
2023-03-14

我是新来的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

问题:下面的代码创建一个数组和一个字符串对象。代码执行后存在多少对这些对象的引用?任一对象是否符合垃圾回收机制?

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

答:有一个对students数组的引用,该数组有一个对字符串Peter Smith的引用。两个对象都不符合垃圾收集的条件。数组student不符合垃圾收集的条件,因为它有一个对对象studentName的引用,即使该对象已被赋值为null。对象studentName也不合格,因为students[0]仍引用该对象。

共有3个答案

白泽语
2023-03-14

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

String studentName = "Peter Smith";

然后你这样做,

studentName = null,

学生名称现在指向另一个指向null的内存地址。“彼得·史密斯”还在记忆的某个地方。

在将值"Peter Smith"分配给学生[0]后,即使将学生名称设置为null,学生[0]仍然保留该值。因为学生[0]在记忆中持有一个持有“彼得·史密斯”的地方。

谭嘉歆
2023-03-14

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

是的。

但解释并不清楚:

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


此外,数组中的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对象不符合垃圾回收机制,因为以前由学生名称变量引用的对象仍然由数组引用,并将新对象分配给变量(如分配学生名称null)仅更改此变量的引用,而不更改引用相同对象的变量的引用。

请注意,数组不会改变任何Java对象分配的方式。
使用List,您可以注意到相同的行为。
例如:

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

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

卫和洽
2023-03-14

数组student不符合垃圾收集的条件,因为它有一个对对象studentName的引用,即使该对象已被赋值为null。

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

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

学生是对数组的引用,因此只要学生仍在范围内,它就不符合垃圾回收机制的条件。

 类似资料:
  • 我是Java新手,从OracleJava教程学习Java。我现在正在学习嵌套类、静态类和内部类。我发现下面的解释似乎很奇怪,我认为这是错误的。 来自:https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html 嵌套类是其封闭类的成员。非静态嵌套类(内部类)可以访问封闭类的其他成员,即使它们被声明为私有。静态嵌套类无权访问封闭类的其

  • 问题内容: 我没有收到来自服务器的JSON类型数据作为响应。 我正在使用JSON插件。 如果我没有得到任何回应,但是如果我没有提及任何响应,那么我正在获取页面的HTML格式。 struts.xml: JSP页面: 控制台错误: org.apache.struts2.dispatcher.Dispatcher- 无法找到动作或结果没有为动作action.Part和结果定义结果。{和“ col1”:“

  • 主试者可能会问你一些与申请职位完全无关的问题,目的在进一步了解你的思考能力及见识,不要表现出不耐烦或惊讶,以免给雇主一个太计较的印象。以下是出国留学网小编为大家整理的面试的时候回答问题的技巧,欢迎大家阅读,更多精彩内容请关注出国留学网. 诚实有礼 态度诚恳,不宜过分客套和谦卑。 不太明白主试者的问题时,应礼貌地请他重复。 陈述自己的长处时,要诚实而不夸张,视乎申请职位的要求,充份表现自己有关的能力

  • 问题内容: 我没有从服务器获得JSON类型数据的响应。 我正在使用JSON插件。 如果我没有得到任何回应,但是如果我没有任何回应,那么我正在获取页面的HTML格式。 控制台错误: -找不到动作或结果没有为动作action.Part和结果定义结果。 我没有获得有关jQuery成功的数据。请纠正我,这是怎么了? 问题答案: 使用A 来指定在执行操作和结果时从回调函数返回的数据类型,以及从服务器返回的响

  • 几天以来,我在运行Struts网络应用程序时遇到了一些问题。我尝试了StackOverflow中与我的问题相关的几个解决方案,但都不起作用。 网状物xml: struts。xml: 登录。jsp: 登录。爪哇: 我补充说: commons-logging-1.1.3。罐子 freemarker-2.3.19。罐子 ognl-3.0.6。罐子 struts2-core-2.3.15.1。罐子 xwo

  • 我可以通过本地J控制台访问Mbean,但无法从远程主机访问MBEANS。 我的配置: 远程进程:服务:jmx:远程处理-jmx://10.32.222.111:4447 我将用户添加到管理和应用领域 测试=2b1be81e1da41d4ea647bd82fc8c2bc9 但当我尝试连接它说:连接失败:重试 当我使用远程进程为:10.32.222.111:4447在服务器上提示警告: 16: 29: