我正在为OCA SE 7考试做准备,其中有些问题确实很棘手。
在我正在使用的其中一本书中,我发现了一个错误,我想确认以下内容...
public static void main(String... args) {
String autumn = new String("autumn"); // line one
System.out.println("autumn" == "summer"); // line two
}
执行
println
方法后,池中有多少个String
对象?据我了解:
-第一行未将字符串添加到池中
-第二行创建“秋天”和“夏天”并将其添加到池中
因此,本书中的正确答案是2。
但是,我也认为...由于Im应该对考试题感到偏执...还创建了字符串“false”并将其添加到池中...所以我认为3应该是正确的答案...还是发生了其他一些不可思议的事情,例如...默认情况下,JVM已经将“true”和“false”放入了池中?
有人可以确认吗?
编辑:
经过一番研究,我发现在书中讲“错误”对我来说是不公平的。作为一般提示:考试问题通常是根据“以下代码”来制定的;因此,他们显然对普通的简单的代码本身在本地执行的简单计算感兴趣。因此,该范围因此不允许检查
println(boolean b)
实现或编译器优化。很公平 :) 最佳答案
它应该是2个字符串:"autumn"
和"false"
。第一行是由第一行创建的。第二行是由第二行创建的,因为编译器会将其优化为:
System.out.println(false);
最终调用
PrintStream#print(boolean)
:public void print(boolean b) {
write(b ? "true" : "false");
}
这是在运行时发生的,即在执行代码后发生的情况。但是,在字节码中存储的常量池的级别上,仅创建了1个字符串常量,即在包含
"autumn
方法的类的类文件中的“main
”。您可以通过运行以下命令进行验证:javap -c -verbose ClassName