因为java除了简单类型外全是reference,== 其实就是判断两个索引是否相等, 而equals这是根据这个class的实现来判断是否相等.
比如:
class Dat{
int a;
int b;
public Dat( int i1, int i2) {
a = i1;
b = i2;
}public boolean equals(Object d) {
Dat o = (Dat)d;
return d.a == a && d.b == b;
}
};Dat d1 = new Dat(1, 2);
Dat d2 = new Dat(2, 3);
Dat d3 = d1;
Dat d4 = new Dat(1,2);
d1 == d3; // true
d1 != d2; // true
d1.equals(d3); // true
d1.equals(d2); // false
d1.equals(d4); //true
比如:
class Dat{
int a;
int b;
public Dat( int i1, int i2) {
a = i1;
b = i2;
}public boolean equals(Object d) {
Dat o = (Dat)d;
return d.a == a && d.b == b;
}
};Dat d1 = new Dat(1, 2);
Dat d2 = new Dat(2, 3);
Dat d3 = d1;
Dat d4 = new Dat(1,2);
d1 == d3; // true
d1 != d2; // true
d1.equals(d3); // true
d1.equals(d2); // false
d1.equals(d4); //true
引用比较(==)
equals在Object中就有了,String类重写了,你可以看源码
而==在比较两个对象时,与Object的equals方法功能一样。但是==也可以比较两个基本类型,比如 (i==0)比较i是否等于0
Conclusion: 分3种情况
1.==可以比较基本类型,而equals是一个方法,没法用于基本类型
2.在比较两个对象时,如果实际调用的equals方法就是Object的方法,那结果==和equals比较结果是相同的
3.如果子类覆盖了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;
}