是否有任何库,给定任何 java 类的两个对象会准确地说明它们是否相等?(该类可能没有定义 hashCode)
否则有什么简单的方法来实现这个吗?
EqualsBuilder
您可以使用提供方法的 Apache Commons' reflectionEquals(a,b)
。
但在大多数情况下,最好还是自己实现equals
(hashCode
请注意,根据合同,您应该始终覆盖两者)。
请注意,大多数集合都依赖于equals
并且hashCode
要正确实现,但是如果您有一个通用的超类,则可以像这样覆盖那里:
public boolean equals(Object obj) {
return EqualsBuilder.reflectionEquals(this, obj);
}
public int hashCode() {
return HashCodeBuilder.reflectionHashCode(this);
}
注意:请注意反射会增加一些性能开销,因此大量使用这些方法可能不明智。
恕我直言,没有库可以检查两个对象是否相等(因为相等应该由您定义)。
您需要覆盖equals
方法并在内部实现您的逻辑。
@Override
public boolean equals(Object other){
//your logic
}
该类可能没有定义 hashCode
请注意该声明,当您使用/处理 Collections 时,您最终会得到令人惊讶的结果,因为您不是覆盖hashcode
方法。
小心使用equals 并覆盖合同
每当 a.equals(b) 时,a.hashCode() 必须与 b.hashCode() 相同。
您可以使用来自 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() 仍然是可取的。
你必须重写equals()
和hashCode()
方法。
你不想担心这个。您可以编写您的对象类并使用IDE
.
您需要覆盖自定义类equals()
的hashCode()
方法。
内部的默认实现equals()
只是进行 == 比较。这意味着它只会检查您正在比较的两个引用是否都指向同一个对象。如果您还想比较其中的实际数据,则别无选择,只能覆盖它以添加比较逻辑。
您可以使用 XMLEncoder 并查看两个对象的编码方式是否相同。这假设您有 getter 和 setter。拥有适当的 equals() 并不难,因为您可以使用 IDE 生成它。