如何比较两个java对象

时间:2013-04-17 19:58:28

标签: java object compare

我有两个从同一个类实例化的java对象。

MyClass myClass1 = new MyClass();
MyClass myClass2 = new MyClass();

如果我将它们的两个属性设置为完全相同的值,然后验证它们是否相同

if(myClass1 == myClass2){
   // objects match
   ...

}

if(myClass1.equals(myClass2)){
   // objects match
   ...

}

然而,这些方法都没有返回真正的价值。我检查了每个属性并匹配。

如何比较这两个对象以验证它们是否相同?

5 个答案:

答案 0 :(得分:79)

您需要在equals()中提供自己的MyClass实施。

@Override
public boolean equals(Object other) {
    if (!(other instanceof MyClass)) {
        return false;
    }

    MyClass that = (MyClass) other;

    // Custom equality check here.
    return this.field1.equals(that.field1)
        && this.field2.equals(that.field2);
}

如果您的对象有可能在哈希表中使用,您还应该覆盖hashCode()reasonable implementation可以将对象字段的哈希码与以下内容组合:

@Override
public int hashCode() {
    int hashCode = 1;

    hashCode = hashCode * 37 + this.field1.hashCode();
    hashCode = hashCode * 37 + this.field2.hashCode();

    return hashCode;
}

有关实现哈希函数的更多详细信息,请参阅this question

答案 1 :(得分:7)

您需要覆盖equalshashCode equals会根据您需要的属性比较对象的相等性,并且hashCode是必需的,以便在CollectionsMaps

中正确使用您的对象

答案 2 :(得分:5)

您必须从类Object

中正确覆盖方法equals()

编辑:我认为我的第一反应被误解可能是因为我不太精确。所以我决定添加更多解释。

为什么必须覆盖equals()?好吧,因为这是在开发人员的领域,以决定两个对象是平等的意义。对于大多数情况,参考平等是不够的。

例如,假设您有一个HashMap,其键的类型为Person。每个人都有姓名和地址。现在,您想要使用密钥找到详细的bean。问题是,您通常无法使用与地图中相同的引用创建实例。你要做的是创建另一个Person类的实例。很明显,operator ==在这里不起作用,你必须使用equals()。

但是现在,我们遇到了另一个问题。让我们假设您的集合非常大,并且您想要执行搜索。天真的实现会使用equals()将您的关键对象与地图中的每个实例进行比较。然而,这将是非常广泛的。这里是hashCode()。正如其他人所指出的,哈希码是一个不必唯一的数字。重要的要求是,只要equals()为两个对象赋予true,hashCode()必须为它们返回相同的值。反过来的含义并不成立,这是一件好事,因为hashcode将我们的密钥分成了一种桶。我们在一个存储桶中有少量类Person的实例。当我们执行搜索时,算法可以立即跳转到正确的存储桶,现在只为每个实例执行equals。因此,hashCode()的实现必须在桶之间尽可能均匀地分布对象。

还有一点。某些集合需要在用作密钥的类中正确实现hashCode()方法,这不仅仅是出于性能原因。示例是:HashSet和LinkedHashSet。如果它们不覆盖hashCode(),则默认为Object hashCode()方法将允许您可能认为“有意义的多个对象” 等于“将被添加到您的”没有重复允许“设置。

一些使用hashCode()

的集合
  • HashSet
  • LinkedHashSet
  • HashMap中

看看apache commons中的那两个类,它们可以让你轻松实现equals()和hashCode()

答案 3 :(得分:5)

您需要在MyClass中实现equals()方法。

==不起作用的原因是检查它们是否引用了同一个实例。由于您为每个实例new,因此每个实例都是不同的实例。

equals()不起作用的原因是因为您尚未自己实现它。我相信它的默认行为与==相同。

请注意,如果要实现hashcode(),还应该实现equals(),因为很多java.util Collections都希望如此。

答案 4 :(得分:2)

1)==在这种情况下评估参考相等性 2)我不太确定equals,但为什么不简单地覆盖compare方法并在MyClass中植入它?