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 个字符串对象。 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!";
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 个字符串对象。 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!";