我正在为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

09-25 20:41