1

我有一个像这样的测试类:

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 以查看一个对象是否具有与另一个对象相同的组件,因此是否相等。有任何想法吗?

4

4 回答 4

4

==比较对象的引用。例如:

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)) {. 但是,这并不是一个很好的示例,请阅读此(链接)以获取更多信息。

于 2013-01-01T20:51:02.807 回答
2

==仅当您比较相同的对象 [即相同的内存位置] 时才返回 true。

如果要按字段比较对象,则必须重载该equals()方法,以便在它们上诱导等价关系

public boolean equals(Object other){

    return this.i == other.i;

}

确保该equals()方法尊重自反性、对称性、传递性。

于 2013-01-01T20:50:47.407 回答
1

==比较引用相等性,即它们是否引用内存中的同一对象。

您需要覆盖equals()方法,并在您想比较它们的值时使用它。hashCode()此外,例如 HashMap 使用的覆盖。

于 2013-01-01T20:50:54.847 回答
0

==运算符不检查类数据中的相等性;相反,它会检查它们是否在内存中的相同位置。如果您这样做o2 = o1而不是以相同的方式初始化它们,它们将在内存中的相同位置,因此o2==o1return true. 但是,由于它们是单独初始化的,因此它返回 false。相反,您应该定义一个equals方法并实现它。

于 2013-01-01T20:51:11.040 回答