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