为什么重写equals()时需要重写hashCode()?
equals()的API Note写道:
通常有必要在重写equals()时重写hashCode,以维护hashCode的Contract
hashCode()的Contract
- 当equals用的信息没有被修改的情况下,一个进程中,多次调用hashCode返回同一个值
- 如果根据equals判定两个对象相等,那么这两个对象的hashCode返回值相等
- 当两个对象不是 equals 的,它们的hashCode不是一定要不相等。但是,如果对于not equals 的对象,hashCode不相等或许能够提升hash table 的性能。
重写equals必须重写hashCode是为了维护hashCode的第二条Contract:
如果根据equals判定两个对象相等,那么这两个对象的hashCode返回值相等。
假如不重写hashCode
如果原本not equal 的obj 经过重写queals 变成了 queal的
在重写queals之前它们的hashCode不相等。
那么此时,equals判定这两个对象相等,但是它们的hashCode不相等
因此有必要重写hashCode