为什么重写equals()还要重写hashCode()?
一、关于两个方法的说明
- public boolean equals(Object obj):The equals method for class Object implements the most discriminating possible equivalence relation on objects; that is, for any non-null reference values x and y, this method returns true if and only if x and y refer to the same object (x == y has the value true). 类对象的equals方法实现了对对象可能存在的最具鉴别性的等价关系;也就是说,对于任何非空参考值x和y,当且仅当x和y引用同一个对象时(x == y值为true),此方法返回true。
- public int hashCode():Returns a hash code value for the object.返回对象的哈希码值。
在实际的使用中,equals()方法并不能满足我们业务的需求。你想,两个对象x,y值相等但却因为引用的是两块不同的内存空间就说x!=y?这不合常理呀,对不对?我们想要的是,当x,y值一样,调用x.equals(y)方法,它返回的是true而不是false,这时就必须得重写equals()方法了。一看到哈希,我们就会想到散列函数,但是散列也是会有冲突的对吧?那么也就是说,存在这么一种可能:两个不同的对象调用hashCode()方法,返回的结果值是一样的。
于是乎,咱可以得到以下的逻辑关系:
- 如果两个对象相同(equals()返回true),那么它们的hashCode()返回值一定相同;
- 如果两个对象不同(equals()返回false),那么它们的hashCode()返回值可能相同也可能不同;
- 如果两个对象的hashCode()返回值相同,那么它们可能相同也可能不同(equals()返回true或false);
- 如果两个对象的hashCode()返回值不同,那么它们一定不同(equals()返回false);
二、为 什 么?
先抛出一个情景假设,如果在重写equals()方法的时候没有重写hashCode()方法,那么即使对象x=y="hello",它们的hashCode()返回值不同(假设没有哈希冲突),那么HashSet集合就会出现重复元素。但是这时候可能就有人说,我平时只是想比较字符串相等,没有用到集合啊,不重写hashCode()也行吧?
fine,当然行啊,Why not?
但是,在工作中,Java集合是经常会用到的呀,所以官方会建议说“重写equals()还要重写hashCode()”。
版权声明:本文为博主原创文章,未经博主允许不得转载。鄙人小白一枚,若有错误,欢迎指正,谢谢。

浙公网安备 33010602011771号