1、如果字符序列相同的对象是直接取自常量池,则都是同一个,用”==“运算符是true;
2、如果对象不是取自常量池,而是new出来的,则是不同的对象,即使字符序列相同。用”==“运算符是false;
String s1 = "china";
String s2 = "good";
final String s3 = "china";
final String s4 = new String("china")
final String w1 = "china".toString();
final String w2 = s3+"";
String s5 = "chinagood";
String s6 = s1+s2; //在堆里面new的对象
String s10 =s1+"good";//在堆里面new的对象
String s7 = "china"+"good"; //编辑器会处理成一个字符串,就是常量池里面的chinagood
String s8 = s3+"good"; //编辑器会处理成一个字符串,就是常量池里面的chinagood
String s9 = s4+"good"; //编辑器没那么智能,会在堆里面new对象
String s11 = w1 +"good"; //编辑器还是没那么智能,会在堆里面new一个对象
String s12 = w2+"good"; //编辑器会处理成一个字符串,就是常量池里面的chinagood
String s13 = "china"+"good".toString();//编辑器没那么智能,会在堆里面new对象
s5==s6 false
s5==s7 true
s5==s8 true
s5==s9 false
s5==s10 false
s5 == s11 false
s5 == s12 true
s5== s13 false
小结:
①字符串用+进行拼接时,如果里面只有常量(不管是字面量常量还是自定义常量),则编辑器会自动处理成一个字符串对象(不会在堆里面new对象)并赋值给左边,需要注意的时,编辑器没有那么智能,如果这个表达式里面牵扯到方法的调用,或者表达式的自定义常量的赋值也牵扯到方法调用,new对象之类的,则编辑器处理不了,仍然会在堆里面new对象;
② String a = ”very“+”nice“ ;这条语句,如果此时常量池为空,只会在常量池里面创建一个verynice 的String对象,不会创建very 和nice,理由还是,编辑器会先处理成一个字符串;