重写equals时需要注意满足java语言规范对于equals的要求:
Java语言规范要求equals
需要具有如下的特性:
- 自反性:对于任何非空引用 x,
x.equals()
应该返回true
。 - 对称性:对于任何引用 x 和 y,当且仅当
y.equals(x)
返回true
,x.equals(y)
也应该返回true
。 - 传递性:对于任何引用 x、y 和 z,如果
x.equals(y)
返回true
,y.equals(z)
也应返回同样的结果。 - 一致性:如果 x 和 y 引用的对象没有发生变化,反复调用
x.equals(y)
应该返回同样的结果。 - 对于任意非空引用 x,
x.equals(null)
应该返回false
。
重写hashCode时注意事项
重写hashCode方法时除了上述一致性约定,还有以下几点需要注意:
(1)返回的hash值是int型的,防止溢出。
(2)不同的对象返回的hash值应该尽量不同。(为了hashMap等集合的效率问题)