先试用代码进行测试
String str1 = "hello"; String str2 = "he"+"llo"; String str3 = "he";
Stirng str4 = str3 + "llo"; System.out.println(str1 == str2); //true System.out.println(str2 == str4); //false System.out.println(str1.equals(str4)); //true
第一种结果,是程序在编译时,JVM编译器对字符串做了优化,str2就被优化成“hello”,str1和str2指向字符串常量池同一个字符串常量,所以“==”比较为true;
第二种结果,String通过+号来拼接字符串的时候,如果有字符串变量(str3)参与,实际上底层会转成通过StringBuilder的append( )方法来实现拼接,StringBuilder 的 toString( )方法底层new了一个String对象,所以str4在堆内存中重新开辟了新空间,而str2指向常量池,所以str2 == str4为false。
StringBuilder sb = new StringBuilder( );//先创建一个StringBuilder对象 sb.append(str3); sb.append("llo"); str4 = sb.toString();
第三种结果,String类中重写equals()方法,在String类中的equals()方法中,先使用“==”判断两个字符串的地址是否相等,如果相等,直接返回true;如果不相等,将两个字符串的转换成char数组,挨个比较其中的字符是否相等,有一个比较不一样的,直接返回false,比较完成之后,都一样,返回true;
public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } }