带有println的池中的字符串计数

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

我的理解是: – 第一行不会将字符串添加到池中 – 第二行创建“autumn”和“summer”并将它们添加到池中所以书中的正确答案是2。

但是,我也认为……因为我应该对考试问题产生偏执……也会创建字符串“false”并添加到池中…所以我认为3应该是正确的答案……还是会发生一些其他的黑魔法……默认情况下JVM已经将“真实”和“假”放入池中了……?

有人可以确认吗?


编辑:经过一些研究后,我发现在书中谈到“错误”并不公平; 作为一般提示:考试题目通常根据“以下代码”制定; 所以他们显然对简单的计算代码本身在本地做什么的简单计算感兴趣。 因此,范围不允许检查println(boolean b)实现或编译器优化。 很公平 :)

它应该是2个字符串: "autumn""false" 。 第一个是由第一行创建的。 第二行是由第二行创建的,因为编译器会将其优化为:

 System.out.println(false); 

最终调用PrintStream#print(boolean)

 public void print(boolean b) { write(b ? "true" : "false"); } 

这是在运行时发生的事情,即在代码执行之后。 但是,在字节码中存储的常量池的级别上, 创建了一个字符串常量 ,它在包含main方法的类的类文件中为"autumn ”。 您可以通过运行来validation这一点:

 javap -c -verbose ClassName 

true和false不是String对象,因此它们不计算在内。 尽管考试问题应该是棘手的,但其目标是检查对一般概念的理解。 在这种情况下是这样的:在类加载期间(运行之前),字符串文字被加载到常量池中。 所以“秋天”和“夏天”将在恒定的池中。

这里有很好的描述: http : //www.javaranch.com/journal/200409/ScjpTipLine-StringsLiterally.html