equals()源码分析:
首先是调用“==”对对象地址的比较,如果两个对象地址相同,则返回true,如果不同,则要先判断这个对象属不属于Stringl类,如果属于则开始每个字符的比较,每个字符都相同的话,则两个字符串相等。
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;
}
}
return false;
}
测试用例:
public class TestString {
public static void main(String[] args) {
String str1 = "hdx";
String str2="hdx";
String str3=new String("hdx");
System.out.println(str1==str2);//常量会被放入一个常量池中,str1,str2都在一个池中所以返回true
System.out.println(str1==str3);//不是同一个对象,所以返回false
//比较两个字符串常用equals()
System.out.println(str1.equals(str3));
}
}
运行结果:
true
false
true
总结:
1.==用于比较两个引用是否指向同一个对象 equals用于比较两个对象是否相等,例如测试中str1和str2都处于常量池中,且都指向“hdx”,所以判断相等,而str1和str3,str1指向常量池,而str3指向堆中的一个对象,所以不等。
2、由于字符串特殊 在字符串常量池中的字符串可以使用==也可以使用equals 推荐不管哪种方式 只要是比较字符串就用equals。