如何比较两个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; } 

看到这个问题更多关于实现一个散列函数的细节。

你需要重写equalshashCode
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?