String str="a"; =号前在栈中 =号后在常量池中
String str=new String("a"); =号前在栈中 =号后在堆中
int i=1; =号前后都在栈中
final int i=1; =号前在栈中 =号后在常量池中
jdk7后常量池在堆中,之前常量池在永久代
String s1 = new String("a");
String s2 = new String("a");
System.out.println(s1==s2);//false
不同对象,false
String str1 = "aaa";
String str2 = "bbb";
String str3 = "aaabbb";
String str4 = str1 + str2;
String str5 = "aaa" + "bbb";
System.out.println(str3 == str4); // false
System.out.println(str3 == str4.intern()); // true
System.out.println(str3 == str5);// true
str1 ,str2 ,str3,str5字符串在常量池中,
str3 == str4// false是因为"+"连接在程序运行中无法确定str4 的内容
str4.intern()就先在常量池中找字符串,找到返回引用,找不到就去堆中找,找到在常量池里添加引用,找不到就去常量池里创建这个字符串
System.out.println(str3 == str4.intern()); // true是因为;str1与str2已经存在于堆中,计算str4时使用intern()方法,就会在常量池里添加引用,并返回引用,所以为true
String s1 = new String("a");
s1.intern();
String s2 = "a";
System.out.println(s1 == s2);//false
String s3 = new String("a") + new String("a");
s3.intern();
String s4 = "aa";
System.out.println(s3 == s4);//true
在 new String("a") + new String("a");第一次new String("a")会在堆中创建"a",第二次new String("a")发现堆中已有"a",使用intern()方法,就会在常量池里添加引用,并返回引用,所以为true