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

Java中equals()和hashCode()之间的联系_第1张图片
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()之间的联系_第2张图片
hashCode-and-equals-contract-600x268.png

问题的原因是什么呢?

2. 问题由hashCode()产生

因为没有重写"hashCode()"方法导致了上面的问题。equals()和hashCode()之间的联系如下:

  1. 如果两个对象是相等的,那么他们的hash code值必须相等。
  2. 如果两个对象的hash code相等,这两个对象可能相等也可能不相等。

Map背后的思想是为了能够比线性搜索更快的查找到一个对象。

问题的解决办法是往Apple类中添加hashCode方法。

public int hashCode(){
    return this.color.hashCode();   
}

你可能感兴趣的:(Java中equals()和hashCode()之间的联系)