写算法的时候,经常会涉及到String的比较问题,但稍不注意的话用错比较方式的话,就会有不一样的结果
首先,都知道==在基本数据类型(int、double…)中是用于直接对比值的大小,而在如String等引用类型时是比较引用地址的
那String类中它的equals方法又是如何进行对比的呢,来看下源码
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;
}
以上可以看出,当执行equals方法时,会先进行
if (this == anObject) {
return true;
}
也就是和Object类中相同的比较引用地址,如果地址相同,则能保证数据绝对相等,相反不同,则在进行
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;
很明显的看出这是在进行逐个的字符进行对比,一旦不相同,则返回false。
很明显了,String类中==为比较数据的引用地址,而equals则是比较数据值是否相同。
也可以通过此图来加深理解