gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 21:06:51 25 4
gpt4 key购买 nike

我正在准备 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 应该是正确答案...或者是否会发生其他一些黑魔法,例如...“true”和“false”默认情况下已由 JVM 放入池中或其他什么?...

有人可以确认一下吗?


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

最佳答案

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

System.out.println(false);

最终调用 PrintStream#print(boolean):

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

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

javap -c -verbose ClassName

关于java - 带有 println 的池中的字符串计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28752489/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com