java 字符串池中将创建多少个字符串对象?

How many String objects will be created in the java string pool?

String hello = "Hello";
String world = " World!";
String bye = "Bye";
String greeting = hello + world;
String goodbye = bye + world;

我知道前三个 java 字符串池中创建了一个新对象,但我不确定后两个。

greeting 和 goodbye 变量中是否只引用了两个字符串池对象,或者是否创建了 2 个新的 String 对象?

在您的示例中,只有前 3 个将在字符串池中创建,后两个将是堆中的字符串对象。 当您使用 + 运算符连接字符串时,它会检查结果字符串是否存在于字符串池中,然后它会 return 一个引用,否则它会创建一个新的 String 对象,即使您正在使用的字符串创建新的已经在池中。 您可以在执行以下操作时进行测试:

greeting == "Hello World!" 
goodbye == "Bye World!"

在这两种情况下它都会 return false,这表明它们不在池中。

在您的例子中,将在字符串池中创建 3 个字符串对象。 greetinggoodbye 将在堆中创建。

javac 优化将 greetinggoodbye 放入字符串池,如果 hellowordbye 是最终的,则 + 操作将在编译时而不是 运行 时执行。
以下两个代码将被编译为相同的字节代码。

final String hello = "Hello";
final String world = " World!";
final String bye = "Bye";
String greeting = hello + world;
String goodbye = bye + world;
final String hello = "Hello";
final String world = " World!";
final String bye = "Bye";
String greeting = "Hello World!";
String goodbye = "Bye World!";