![](https://img-blog.csdnimg.cn/899c4c0ea2ee445da44dafa887850015.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6L2v5Lq65a2mamF2YQ==,size_20,color_FFFFFF,t_70,g_se,x_16)
//底层底层底层底层底层底层底层底层底层底层底层底层底层底层
//底层底层底层底层底层底层底层底层底层底层底层底层底层底层
//底层底层底层底层底层底层底层底层底层底层底层底层底层底层
//底层底层底层底层底层底层底层底层底层底层底层底层底层底层
//底层底层底层底层底层底层底层底层底层底层底层底层底层底层
//底层底层底层底层底层底层底层底层底层底层底层底层底层底层
//底层底层底层底层底层底层底层底层底层底层底层底层底层底层
//底层底层底层底层底层底层底层底层底层底层底层底层底层底层
return new String(result, 0, len + resultOffset);
两个String 对象相加,底层先生成一个StringBulider 对象,然后对两个字符串进行append,最后调用StringBuilder的toString方法进行返回 新的String对象 return new String()
String a="a";
String b="b";
String c=a+b;
String d=new String("ab");
System.out.println(a+b==c); //false
System.out.println((a+b).equals(c)); //ture
调用equals方法时候,String重写了equals ,比较的是String的值, 而==比较的是引用的地址的值,所以只要a+b一次就会返回一个新的String对象
看一个新的方法类似
public static boolean isAdmin(String userId){
return userId.toLowerCase()=="admin";
}
public static void main(String[] args){
System.out.println(isAdmin("Admin"));
}
以上代码返回false 还是一样底层上面方法返回 new String()
![](https://img-blog.csdnimg.cn/aa546ad94b694645a807a7a5400a6c63.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6L2v5Lq65a2mamF2YQ==,size_20,color_FFFFFF,t_70,g_se,x_16)
注意注意注意
String test="javaandpython";
String str1="java";
String str2="and";
String str3="python";
System. out. println(test=="java"+"and"+"python");
System. out. println(test ==str1 + str2 + str3);
第一个true 第二个false就不讲了,第一个由于是字符串字面量进行+操作,编译阶段直接有一个
javaandpython的字符串再常量池中,而不是通过StringBuilder.