请解决我对equals()的疑问。我认为equlas()会在以下内容中检查内容 例如,它应该打印为true,因为内容与t1和t1都相同 t2,但它打印错误。为什么呢?
public class Test {
public static void main(String args[]) {
Test1 t1 = new Test1(10);
Test1 t2 = new Test1(10);
System.out.println(t1.equals(t2));
}
}
class Test1 {
int a ;
Test1( int x){
a = x ;
}
}
提前致谢
答案 0 :(得分:2)
您需要覆盖equals
课程中的Test1
以获得所需的行为。否则,该类将继承equals
from Object
,它仅确定两个引用是否引用同一对象。在这里,您有不同的实例,因此false
就是结果。
从链接的javadocs引用:
类Object的equals方法实现最具辨别力 对象可能的等价关系;也就是说,对于任何非null 引用值x和y,当且仅当x时,此方法返回true 和y引用相同的对象(x == y的值为true)。
通常,您测试其他对象是否属于同一个类,然后比较各个字段是否相等。
答案 1 :(得分:2)
您应该覆盖equals()
,因为默认方法会比较引用。
下面的方法会正确比较两个对象。
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Test1 other = (Test1) obj;
if (a != other.a)
return false;
return true;
}
答案 2 :(得分:2)
equals()
by default比较引用;并且两个不同对象的引用(在这种情况下为t1
和t2
)是不相等的。您必须覆盖它以检查成员之间的相等性:
@Override
public boolean equals(Object o) {
return (o instanceof Test1) && a == ((Test1)o).a;
}
作为一般规则,每当您覆盖equals()
时覆盖hashCode()
是个好主意:
@Override
public int hashCode() {
return a;
}
答案 3 :(得分:1)
您需要覆盖Test1
课程中的equals方法。也许是这样的:
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Test1 other = (Test1) obj;
if (a != other.a)
return false;
return true;
}
答案 4 :(得分:0)
@Override
public boolean equals(Object obj){
if(!(obj instanceof Test))
return false;
return ((Test)obj).x == this.x;
}
在“测试”中覆盖equals()
以检查x