我有两个从同一个类实例化的java对象。
MyClass myClass1 = new MyClass();
MyClass myClass2 = new MyClass();
如果我将它们的两个属性设置为完全相同的值,然后验证它们是否相同
if(myClass1 == myClass2){
// objects match
...
}
if(myClass1.equals(myClass2)){
// objects match
...
}
然而,这些方法都没有返回真正的价值。我检查了每个属性并匹配。
如何比较这两个对象以验证它们是否相同?
答案 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)
您需要覆盖equals
和hashCode
equals
会根据您需要的属性比较对象的相等性,并且hashCode
是必需的,以便在Collections
和Maps
答案 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()
的集合看看apache commons中的那两个类,它们可以让你轻松实现equals()和hashCode()
答案 3 :(得分:5)
您需要在MyClass
中实现equals()方法。
==
不起作用的原因是检查它们是否引用了同一个实例。由于您为每个实例new
,因此每个实例都是不同的实例。
equals()
不起作用的原因是因为您尚未自己实现它。我相信它的默认行为与==
相同。
请注意,如果要实现hashcode()
,还应该实现equals()
,因为很多java.util Collections都希望如此。
答案 4 :(得分:2)
1)==在这种情况下评估参考相等性 2)我不太确定equals,但为什么不简单地覆盖compare方法并在MyClass中植入它?