equals()方法是Object类的方法,所有的类都集成了此方法,还有部分类重写了这个方法,我们看一下Object类中关于该方法的的源码:
-
public boolean equals(Object obj) {
-
return (this == obj);
-
}
可以知道,凡事从Object中继承的equals()方法底层使用的都是==,也就是两者比较的都是地址值。
我们再来说一下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;
-
}
该方法中,首先用==比较,如果两者地址值相同,就返回true,如果地址值不相同,再判断字符串内容是否相同,如果相同,返回值也是true,我们可以做一个实验:
-
class equalsTest{
-
public static void main(String[] args){
-
String a = "abc";
-
String b = "abc";
-
String c = new String("abc");
-
sop(a==b); //true
-
sop(a.equals(b)); //true
-
sop(a==c); //false
-
sop(a.equals(c)); //true
-
}
-
-
public static void sop(Object o){
-
System.out.println(o);
-
}
-
}
这个实验中,变量a和b底层默认启动的享元设计模式,指向的都是“abc”这个字符串对象,所以地址值相同,而语句new String("abc")底层创建的是两个对象,所以c的地址值和a,b不同,用==判断的结果为false,但是c指向的字符串内容与a是相同的,所以用equals()判断的结果为ture。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69920205/viewspace-2644624/
,如需转载,请注明出处,否则将追究法律责任。