我试图在迭代器中比较x的2个实例的值。
x是包含其自己的数据成员的引用类型。我试图将x的一个实例与另一个实例进行比较,以确定每个实例中的值是否相同。
if(x.equals(x))
实际上每个x实例的值不同时,
保持评估为真。
干杯。
答案 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()