如何比较两个java对象
我有两个从同一个类实例化的Java对象。
MyClass myClass1 = new MyClass(); MyClass myClass2 = new MyClass();
如果我将它们的两个属性设置为完全相同的值,然后validation它们是相同的
if(myClass1 == myClass2){ // objects match ... } if(myClass1.equals(myClass2)){ // objects match ... }
但是,这些方法都不能返回真正的价值。 我检查了每个的属性,他们匹配。
我如何比较这两个对象来validation它们是相同的?
你需要在MyClass
提供你自己的equals()
实现。
@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()
。 一个合理的实现是将对象字段的哈希代码与如下的东西结合起来:
@Override public int hashCode() { int hashCode = 1; hashCode = hashCode * 37 + this.field1.hashCode(); hashCode = hashCode * 37 + this.field2.hashCode(); return hashCode; }
看到这个问题更多关于实现一个散列函数的细节。
你需要重写equals
和hashCode
。
equals
将根据您需要的属性比较对象的相等性,并且hashCode
是必需的,以便您的对象在“ Collections
和“ Maps
正确使用
你需要在你的MyClass
实现equals()方法。
==
没有工作的原因是这是检查他们指的是同一个实例。 既然你为每一个做了new
的事情,每一个都是不同的事例。
equals()
不起作用的原因是你还没有自己实现它。 我相信它的默认行为和==
是一样的。
请注意,如果要实现equals()
,则还应该实现hashcode()
,因为很多java.util集合都期望这样做。
你必须正确地从类Object中覆盖方法equals()
编辑 :我想我的第一个反应可能是因为我不太精确而被误解了。 所以我决定增加更多的解释。
为什么你必须重写equals()? 那么,因为这是在开发人员的领域,以决定两个对象是什么意思是平等的。 大多数情况下,参考平等是不够的。
例如,假设你有一个HashMap,其键的types是Person。 每个人都有姓名和地址。 现在,你想使用键find详细的bean。 问题是,您通常无法使用与地图中相同的参考创build实例。 你所做的就是创buildPerson类的另一个实例。 显然,operator ==在这里不起作用,你必须使用equals()。
但现在,我们来到另一个问题。 假设你的collections非常庞大,你想要执行search。 天真的实现将使用equals()将您的关键对象与地图中的每个实例进行比较。 但是,这将是非常广泛的。 这里是hashCode()。 正如其他人指出的,散列码是一个单一的数字,不一定是唯一的。 重要的要求是,只要equals()为两个对象赋予true,hashCode()必须为它们返回相同的值。 反意义不成立,这是一件好事,因为散列码把我们的键分成了一些桶。 我们在单个桶中有less量的Person类实例。 当我们执行一个search时,algorithm可以立即跳到一个正确的桶,现在只有每个实例执行equals。 因此,hashCode()的实现必须尽可能均匀地在桶之间分配对象。
还有一点。 一些集合需要在用作关键字的类中正确实现hashCode()方法,这不仅是出于性能原因。 示例是:HashSet和LinkedHashSet。 如果它们不重写hashCode(),则默认的Object hashCode()方法将允许您可能认为“有意义的相等”的多个对象添加到“不允许重复”集合中。
一些使用hashCode()的集合
- HashSet的
- LinkedHashSet
- HashMap中
看一下这两个来自apache commons的类,它们将允许你轻松地实现equals()和hashCode()
- EqualsBuilder
- HashCodeBuilder
1)==在这种情况下评估引用相等
2)即时通讯不太清楚等于什么,但为什么不简单地重写比较方法,并将其植入MyClass?