Java:比较对象值

时间:2009-07-09 01:42:56

标签: java iterator compare

我试图在迭代器中比较x的2个实例的值。

x是包含其自己的数据成员的引用类型。我试图将x的一个实例与另一个实例进行比较,以确定每个实例中的值是否相同。

if(x.equals(x))

实际上每个x实例的值不同时,

保持评估为真。

干杯。

6 个答案:

答案 0 :(得分:8)

假设您的代码看起来不像这样

X x = new X();
if(x.equals(x))

但更像是

X x = new X();
X y = new X();

if(x.equals(y)) { }

你得到x.equals(y)的错误值,那么你的equals实现就会被打破。

转到Class X并检查equals的实施方式。如果没有在X中实现超级类检查。

答案 1 :(得分:1)

这是一个难以回答的问题。它们必须是对象而不是具有.equals方法的基元。那么equals方法是否已被覆盖,导致错误的比较?那将是我要看的地方。

答案 2 :(得分:0)

听起来你在比较参考而不是数据。

编辑: 来自Object的API文档: “类Object的equals方法实现了对象上最具辨别力的等价关系;也就是说,对于任何非空引用值x和y,当且仅当x和y引用同一对象时,此方法才返回true(x = = y的值为true)。“

e.g。如果'X'或它的父类不重写equals那么当你调用equals然后它将比较引用,如果它们是相同的对象将始终是相等的。

通过它的声音你需要覆盖类'X'中的equals方法,但是再说一遍,你所说的似乎表明它们无论如何都是相同的参考?

答案 3 :(得分:0)

equals类中的Object方法执行instance-equals操作。但是,Object的子类通常会覆盖此方法以执行relative-equals操作,其中目标对象中的值将根据相关对象的值进行测试。在您的情况下,您最有可能使用覆盖Object方法的equals子类。最好知道如何实现类equals的{​​{1}}方法。

答案 4 :(得分:0)

我将假设你的两个X对象实际上是不同的对象,而不是错误的相同对象。在这种情况下,问题是该类的equals()实现。检查你的类及其超类的equals()实现,并确保它实际上进行智能比较。如有必要,请自己编写。

class Square
{
    public int length;

    public boolean equals( Square s )
    {
        return this.length == s.length;
    }
}

答案 5 :(得分:0)

如果您决定覆盖 equals(),还要覆盖 hashcode()