Java中equals()和hashCode()之间的联系

Java中equals()和hashCode()之间的联系
文章图片
java-hashcode-650x369.jpeg Java超类java.lang.Object定义了两个重要方法。

public boolean equals(Object obj) public int hashCode()

在文章中吗,我首先会展示一个常见错误的例子,然后解释equals()和hashCode()工作的联系。
1. 一个常见错误 下面的例子展示了常见的错误:
import java.util.HashMap; public class Apple { private String color; public Apple(String color) { this.color = color; }public boolean equals(Object obj) { if(obj==null) return false; if (!(obj instanceof Apple)) return false; if (obj == this) return true; return this.color.equals(((Apple) obj).color); }public static void main(String[] args) { Apple a1 = new Apple("green"); Apple a2 = new Apple("red"); //hashMap stores apple type and its quantity HashMap m = new HashMap(); m.put(a1, 10); m.put(a2, 20); System.out.println(m.get(new Apple("green"))); } }

在main方法中,创建了一个红苹果和绿苹果,并放到了HashMap中。然而,当要求从HashMap中得到绿苹果时,绿苹果却找不到了。上面的代码执行结果将会打印null。
我们在debugger时,检查HashMap后,可以肯定绿苹果已经被存储到了hashMap。
Java中equals()和hashCode()之间的联系
文章图片
hashCode-and-equals-contract-600x268.png 问题的原因是什么呢?
2. 问题由hashCode()产生 因为没有重写"hashCode()"方法导致了上面的问题。equals()和hashCode()之间的联系如下:
  1. 如果两个对象是相等的,那么他们的hash code值必须相等。
  2. 如果两个对象的hash code相等,这两个对象可能相等也可能不相等。
Map背后的思想是为了能够比线性搜索更快的查找到一个对象。
【Java中equals()和hashCode()之间的联系】问题的解决办法是往Apple类中添加hashCode方法。
public int hashCode(){ return this.color.hashCode(); }

    推荐阅读