12

我正在准备 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。

但是,我也认为...因为我应该对考试问题偏执...字符串“false”也被创建并添加到池中...所以我认为 3 应该是正确答案...还是会发生其他一些黑魔法,例如...“true”和“false”已经被JVM默认放入池中或其他什么?...

有人可以确认吗?


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

4

2 回答 2

14

它应该是 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
于 2015-02-26T20:53:16.003 回答
0

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

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

于 2015-02-26T20:53:58.827 回答