两个对象的等价

时间:2013-12-10 09:09:07

标签: java equivalence

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

否则有任何简单的方法来实现它吗?

7 个答案:

答案 0 :(得分:2)

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

但在大多数情况下,最好自己实施equalshashCode(请注意,通过合同,您应该始终覆盖两者)。

请注意,大多数集合都依赖于equalshashCode才能正确实现,但如果您有一个共同的超类,那么您可能会覆盖那样:

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

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

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

答案 1 :(得分:1)

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

你需要override equals method并在里面实现你的逻辑。

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

该类可能没有定义hashCode

请注意该声明,当您使用/处理收藏集时,您最终会得到惊喜结果,因为您没有覆盖hashcode方法。

小心equals and override contract

  

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

答案 2 :(得分:0)

您必须覆盖equals()hashCode()方法。

你不想担心这个。您可以编写对象类并使用IDE生成这些方法。

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

您可以使用XMLEncoder并查看两个对象是否以相同的方式编码。这假设您有吸气剂和固定剂。有了正确的equals()并不是很难,因为你可以使用IDE生成它。

答案 5 :(得分: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

reflectionEquals方法将检查对象中的每个字段是否与其他对象相等。它正在使用反射。如果你没有实现equals(),那么它只是检查引用。仍然建议实现equals()和hashCode()。

答案 6 :(得分:0)

我正在寻找与此类似的东西

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

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