我有一个类似的测试类:
public class CompareObjects {
public static class Obj {
public int i;
public Obj(int i) {
this.i = i;
}
}
public static void main(String[] args) {
Obj o1 = new Obj(0);
Obj o2 = new Obj(0);
if(o1 == o2) {
System.out.println("Equal");
}else{
System.out.println("Not equal");
}
}
}
我虽然测试会返回“Equal”,但事实并非如此。为什么Java不考虑具有相同组件的两个对象不一样?我在这里做错了吗?当我开始学习Java时,我有一种感觉,我完全忽略了一些东西。
另外,我用equals()方法测试了两者,我得到了相同的结果。我对这个问题的理由是,我希望能够使用contains()方法测试ArrayList,以查看一个对象是否具有与另一个对象相同的组件,因此是相等的。有什么想法吗?
答案 0 :(得分:3)
==
将引用与对象进行比较。例如:
Obj a = new Obj(0);
Obj b = a;
//a == b
尝试实施equals()
:
public static class Obj {
public int i;
public Obj(int i) {
this.i = i;
}
@Override
public boolean equals(Object other) {
if (other == this) return true;
if (!(other instanceof Obj) || other == null) return false;
return i == ((Obj)other).i;
}
@Override
public int hashCode() {
return i;
}
}
然后,您可以使用if(o1.equals(o2)) {
。但是,这不是一个很好的例子,请阅读this (link)以获取更多信息。
答案 1 :(得分:1)
==
才会返回true相同的记忆位置]。
如果您想按字段比较对象,则必须重载equals()
方法,以便对它们产生equivalence relation。
public boolean equals(Object other){
return this.i == other.i;
}
确保equals()
方法尊重自反性,对称性,传递性。
答案 2 :(得分:1)
==
比较引用相等,即它们是否引用内存中的同一对象。
您需要覆盖equals()
方法,并在想要比较其值时使用它。另外,例如,覆盖HashMap使用的hashCode()
。
答案 3 :(得分:0)
==
运算符不检查类数据中的相等性;相反,它检查它们是否在内存中是相同的位置。如果您执行了o2 = o1
而不是以相同的方式初始化它们,那么它们将是内存中的相同位置,因此o2==o1
将返回true
。但是,由于它们是分别初始化的,因此返回false。相反,您应该定义equals
方法并实现它。