-3

是否有任何库,给定任何 java 类的两个对象会准确地说明它们是否相等?(该类可能没有定义 hashCode)

否则有什么简单的方法来实现这个吗?

4

7 回答 7

2

EqualsBuilder您可以使用提供方法的 Apache Commons' reflectionEquals(a,b)

但在大多数情况下,最好还是自己实现equalshashCode请注意,根据合同,您应该始终覆盖两者)。

请注意,大多数集合都依赖于equals并且hashCode要正确实现,但是如果您有一个通用的超类,则可以像这样覆盖那里:

public boolean equals(Object obj) {
  return EqualsBuilder.reflectionEquals(this, obj);
}

public int hashCode() {
 return HashCodeBuilder.reflectionHashCode(this);
}

注意:请注意反射会增加一些性能开销,因此大量使用这些方法可能不明智。

于 2013-12-10T09:14:57.457 回答
1

恕我直言,没有库可以检查两个对象是否相等(因为相等应该由您定义)。

您需要覆盖equals方法并在内部实现您的逻辑。

@Override
public boolean equals(Object other){
    //your logic
}

该类可能没有定义 hashCode

请注意该声明,当您使用/处理 Collections 时,您最终会得到令人惊讶的结果,因为您不是覆盖hashcode方法。

小心使用equals 并覆盖合同

每当 a.equals(b) 时,a.hashCode() 必须与 b.hashCode() 相同。

于 2013-12-10T09:11:30.170 回答
0

您可以使用来自 commons-lang 的 EqualsBuilder。 http://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/builder/EqualsBuilder.html#reflectionEquals%28java.lang.Object,%20java.lang.Object %29

reflectEquals 方法将检查对象中的每个字段与其他对象是否相等。它与反射一起工作。如果你不实现 equals() 那么它只是检查引用。实现equals() 和hashCode() 仍然是可取的。

于 2013-12-10T09:18:48.527 回答
0

我正在寻找类似的东西

http://code.google.com/p/deep-equals/

如果未定义哈希码和相等,这将使用值等价检查对象之间的语义相等。

于 2013-12-11T04:46:52.447 回答
0

你必须重写equals()hashCode()方法。

你不想担心这个。您可以编写您的对象类并使用IDE.

于 2013-12-10T09:12:14.467 回答
0

您需要覆盖自定义类equals()hashCode()方法。

内部的默认实现equals()只是进行 == 比较。这意味着它只会检查您正在比较的两个引用是否都指向同一个对象。如果您还想比较其中的实际数据,则别无选择,只能覆盖它以添加比较逻辑。

于 2013-12-10T09:12:37.510 回答
0

您可以使用 XMLEncoder 并查看两个对象的编码方式是否相同。这假设您有 getter 和 setter。拥有适当的 equals() 并不难,因为您可以使用 IDE 生成它。

于 2013-12-10T09:17:36.350 回答