无论是看ppt或者网上的观点,大多对这两者是这样说的,equals是比较内容,而"=="是指地址。。前些天,复习j2se的东西,看了一下源码,才有些理解了,不知道对不对,欢迎大家的指正。。
这两个其实是相同的。。在Object那个类里面equals方法是这样写的:
代码如下
public boolean equals(Object obj) {
return (this == obj);
}
也就是说返回的是当前对象,如果不重写toString方法,那么它的值肯定是一个地址,与"=="是没啥区别的。。
那么为什么说equals是比较内容呢?我估计是因为String。。
有这样一个例子:
String a=new String("abc");
String b=new String("abc");
System.out.println(a.equals(b));//也许在这里是被认为内容相同,他们在比较内容。。
我查看了一下String里面的equals方法,它是重写Object的equals方法了,代码如下:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}
这个意味着如果一个对象不重写equals方法,不管他们的属性是否相同,它们用equals来比较都是false!
这两个其实是相同的。。在Object那个类里面equals方法是这样写的:
代码如下
public boolean equals(Object obj) {
return (this == obj);
}
也就是说返回的是当前对象,如果不重写toString方法,那么它的值肯定是一个地址,与"=="是没啥区别的。。
那么为什么说equals是比较内容呢?我估计是因为String。。
有这样一个例子:
String a=new String("abc");
String b=new String("abc");
System.out.println(a.equals(b));//也许在这里是被认为内容相同,他们在比较内容。。
我查看了一下String里面的equals方法,它是重写Object的equals方法了,代码如下:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}
这个意味着如果一个对象不重写equals方法,不管他们的属性是否相同,它们用equals来比较都是false!
equals , clone,等等的
(1)Object 是所有类的基类,Object中的equals方法和==是一样的意思,都是比较地址所指向对象。
(2)String等重写了equals方法,使得equals和==有了不一样的意思,即equals比较的是String对象的值,==比较的是String对象的地址。
结论就是,对于重写了Object中equals方法的类来说,equals可能和==有不一样的意思。对于没有重写Object中equals方法的类来说,equals完全和==表达一样的意思,即比较引用地址。