String hello = "Hello";
String world = " World!";
String bye = "Bye";
String greeting = hello + world;
String goodbye = bye + world;
我知道前三个对象在java字符串池中创建了一个新对象,但是我不确定后两个对象。
在greeting和再见变量中是否仅引用了两个字符串池对象,还是创建了两个新的String对象?
答案 0 :(得分:3)
在您的示例中,仅前三个将在字符串池中创建,后两个将是堆中的字符串对象。 当您使用+运算符连接字符串时,它将检查结果字符串是否存在于字符串池中的原因,它将返回一个引用,否则它将创建一个新的String对象,即使您用来创建新字符串的字符串也是如此一个已经在游泳池里了。 您可以在执行以下操作时进行测试:
greeting == "Hello World!"
goodbye == "Bye World!"
在两种情况下都将返回false,这表明它们不在池中。
答案 1 :(得分:3)
在您的情况下,将在字符串池中创建3个字符串对象。 greeting
和goodbye
将在堆中创建。
javac进行了优化,如果greeting
,goodbye
和hello
是最终的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!";