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。
文章图片
hashCode-and-equals-contract-600x268.png 问题的原因是什么呢?
2. 问题由hashCode()产生 因为没有重写"hashCode()"方法导致了上面的问题。equals()和hashCode()之间的联系如下:
- 如果两个对象是相等的,那么他们的hash code值必须相等。
- 如果两个对象的hash code相等,这两个对象可能相等也可能不相等。
【Java中equals()和hashCode()之间的联系】问题的解决办法是往Apple类中添加hashCode方法。
public int hashCode(){
return this.color.hashCode();
}
推荐阅读
- 热闹中的孤独
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- Shell-Bash变量与运算符
- JS中的各种宽高度定义及其应用
- 2021-02-17|2021-02-17 小儿按摩膻中穴-舒缓咳嗽
- 深入理解Go之generate
- 异地恋中,逐渐适应一个人到底意味着什么()
- 我眼中的佛系经纪人
- 《魔法科高中的劣等生》第26卷(Invasion篇)发售
- “成长”读书社群招募