我正在尝试比较迭代器中 x 的 2 个实例的值。
x 是包含自己的数据成员的引用类型。我正在尝试将 x 的一个实例与另一个实例进行比较,以确定每个实例中的值是否相同。
如果(x.等于(x))
当 x 的每个实例的实际值不同时,继续评估为真。
干杯。
假设您的代码看起来并不像这样
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 中实现,请检查超类。
这是一个很难用给出的细节来回答的问题。它们必须是对象而不是基元才能具有 .equals 方法。那么是否以导致错误比较的方式覆盖了 equals 方法?那将是我要看的地方。
听起来您正在比较参考而不是数据。
编辑:来自 Object 的 API 文档:“Object 类的 equals 方法实现了对象上最有区别的可能等价关系;也就是说,对于任何非空引用值 x 和 y,当且仅当 x 和y 指的是同一个对象(x == y 的值为 true)。"
例如,如果'X' 或其父类没有覆盖equals,那么当您调用equals 时,它将比较引用,如果它们是同一个对象,则它们将始终是相等的。
听上去你需要重写类'X'中的equals方法,但话又说回来,你所说的似乎表明它们无论如何都是相同的引用?
类中的equals
方法Object
执行实例等于操作。然而,对于 的子类来说,Object
重写此方法以执行相对等于操作是很常见的,其中目标对象中的值会根据相关对象的值进行测试。在您的情况下,您很可能使用了Object
覆盖该equals
方法的子类。最好知道equals
您的类的方法是如何X
实现的。
我将假设您的两个 X 对象实际上是不同的对象,而不是错误的同一个对象。在这种情况下,问题在于该类的 equals() 实现。检查您的类及其超类是否有 equals() 实现,并确保其实际进行智能比较。如有必要,请自己编写。
class Square
{
public int length;
public boolean equals( Square s )
{
return this.length == s.length;
}
}
如果你决定重写equals( ),也要重写hashcode()