- 动态拼接之后的新字符串不会自动放到字符串常量池中:
public class StringTest {
public static void main(String[] args) {
String s1 = "abc";
String s2 = "def";
String s3 = s1 + s2;
String s4 = "abcdef";
System.out.println(s3 == s4); //fase
}
}
- s3指向的对象,没有在常量池中,在堆中。
- 以上程序字符串常量池中有三个:“abc” “def” “abcdef”。
- 除了字符串常量池的字符串之外,在堆中还有一个字符串对象“abcdef”。
- 两个字符串字面量拼接会做编译阶段的优化,在编译阶段就会进行字符串的拼接。
public class StringTest {
public static void main(String[] args) {
String x = "java" + "test";
String y = "javatest";
System.out.println(x == y); //true
}
}
以上程序会在编译阶段进行拼接,因此以上程序在字符串常量池中只有一个:“javatest”。
总结
- 使用 + 号(+ 两边至少有一个是变量)进行拼接生成的新的字符串不会放到字符串常量池中。
- 当 + 号两边都是字符串字面量的时候,编译器会进行自动优化。在编译阶段进行拼接。