String str = "123";//直接在常量池中开辟一个空间,并将这个对象的地址给str String str1 = new String("123");//它相当于new了两个对象,一个在堆中,一个在常量池中
package Stringdemo; public class Demo01 { public static void main(String[] args) { String str = "123"; String str1 = "123456";//相当于在方法区常量池中开辟了一个空间,存放着123对象 String str3 = str+"456"; String str4 = "123"+"456"; System.out.println(str3 == str1);//false System.out.println(str3 == str4);//false System.out.println(str1 == str4);//true System.out.println(str3.intern() == str4);//true } } 输出: false false true true //结论: 在常量池中只能允许有一个对象存在 如果有变量进行字符串的拼接的时候,相当于在堆中new出一个对象 当字符串使用intern()方法的时候,就会返回其在常量池的地址 补充:当字符串定义为final之后,就变成了常量,就在常量池中,再进行拼接的时候也是在常量池中进行 public class Demo3 { public static void main(String[] args) { String str = "123456"; final String str1 = "123"; String str2 = str1 + "456"; System.out.println(str2 == str); } }