String count in the pool with println

2020-03-10 05:48发布

I am preparing for the OCA SE 7 exam, and some of these questions are really (!) tricky.

In one of the books Im using I found an error I think, so I would like to confirm the following please...

public static void main(String... args) {
    String autumn = new String("autumn");      // line one
    System.out.println("autumn" == "summer");  // line two
}

After the println method executes, how many String objects are there in the pool?

It is my understanding that: - line one does not add the string to the pool - line two creates "autumn" and "summer" and adds them to the pool So the correct answer in the book is 2.

However, I also think... since Im supposed to be paranoid with the exam questions... that also the string "false" is created and added to the pool... So I think 3 should be the correct answer... or does some other black magic happen like... "true" and "false" are already put into the pool by the JVM by default or something?...

Can someone please confirm?


Edit: after some research I find that it was not fair of me to speak of an 'error' in the book; as a general tip: exam questions are usually formulated in terms of 'the following code'; so they are clearly interested in plain old simple calculation of what the code itself is locally doing. So the scope therefore does not allow inspection of the println(boolean b) implementation or compiler optimizations. Fair enough :)

2条回答
Viruses.
2楼-- · 2020-03-10 05:57

true and false are not String objects, so they do not count. Even though the exam questions are supposed to be tricky, it's goal is to check the understanding of general concepts. Which is in this case: during class loading (before running), the string literals are loaded to the constant pool. So "autumn" and "summer" will be in the constant pool.

It is described here nicely: http://www.javaranch.com/journal/200409/ScjpTipLine-StringsLiterally.html

查看更多
啃猪蹄的小仙女
3楼-- · 2020-03-10 06:15

It should be 2 strings: "autumn" and "false". The first is created by the first line. The second is created by the second line because the compiler would optimize it to just:

System.out.println(false);

which ends up calling PrintStream#print(boolean):

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

This is what happens at runtime, i.e. after the code is executed. However, at the level of the constant pool stored in the bytecode, only 1 string constant is created which is "autumn" in the classfile of the class which contains your main method. You can verify this by running:

javap -c -verbose ClassName
查看更多
登录 后发表回答