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

时间:2019-06-15 12:28:50

标签: java string concatenation pool

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

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

在greeting和再见变量中是否仅引用了两个字符串池对象,还是创建了两个新的String对象?

2 个答案:

答案 0 :(得分:3)

在您的示例中,仅前三个将在字符串池中创建,后两个将是堆中的字符串对象。 当您使用+运算符连接字符串时,它将检查结果字符串是否存在于字符串池中的原因,它将返回一个引用,否则它将创建一个新的String对象,即使您用来创建新字符串的字符串也是如此一个已经在游泳池里了。 您可以在执行以下操作时进行测试:

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

在两种情况下都将返回false,这表明它们不在池中。

答案 1 :(得分:3)

在您的情况下,将在字符串池中创建3个字符串对象。 greetinggoodbye将在堆中创建。

javac进行了优化,如果greetinggoodbyehello是最终的word,则将bye+放入字符串池操作将在编译时而不是运行时执行。
两个波纹管代码将被编译为相同的字节代码。

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!";