具有相同数据的两个对象不一样?

时间:2013-01-01 20:48:16

标签: java object compare equals

我有一个类似的测试类:

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 个答案:

答案 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方法并实现它。

相关问题