Java重写hashcode的标准

hashCode是指在hash maps中使用的哈希码,一旦equals()方法被重写,则hashCode()方法也必须被重写。

当equals方法中涉及的参数没有改变时,hashCode应保持不变。

如果根据equals方法,两个对象是相等的,那么这两个对象的hashCode应该一样。

两个对象如果不相等,hashCode不强制要求不一样,但是如果能保证不一样,对哈希的效率会比较有帮助最重要的是第二点,相等的对象必须有相同的hashCode,由于默认的hashCode方法针对每一个对象返回一个固定的随机值(有的实现是根据对象地址返回值,相当于每一个对象对应一个固定的随机值),所以当我们使用equals方法的同时,必须override(重写)hashCode方法,以满足这一点。

如何计算hashCode

生成一个int类型的变量result,并且初始化一个值,比如17

对类中每一个重要字段,也就是影响对象的值的字段,也就是equals方法里有比较的字段,进行以下操作:a. 计算这个字段的值filedHashValueb. 执行 result = 31 * result + filedHashValue; 更新结果而要如和计算这个字段的值filedHashValue值呢,根据字段类型分为三种情况,一种是基础数据(比如int,boolean,),一种是对象,还有一种是数组。

如何计算每个重要字段的值

如果字段是基础数据,假设数值为f,根据类型

boolean,true返回1,false返回0

byte, char, short, int返回对应的int值

long,返回f^(f>>>32)

float,返回Float.floatToIntBits(f)

double,执行Double.doubleToLongBits(f)转为long,再返回compute(int)(f^(f>>>32))

如果字段是对象,如果是null,返回0,否则根据上述【如何计算hashCode】中所述步骤1和2,计算这个对象的hashCode,作为这个字段的值。实际上是一个递归的过程。

而如果字段是数组,则对每一个元素进行计算,得到filedHashValue,并执行result = 31 * result + filedHashValue;

代码示例:

TantanitReaderPhone的哈希值计算

那么我们让hashCode()每次都返回一个固定的数,比如41,10可以么?

比如可以这么写:

@Override  
    public int hashCode() {  
        return 10;  
  
    }
如果这样的话,HashMap, HashSet等集合类就失去了其 "哈希的意义".用<Effective Java>中的话来说就是,哈希表退化成了链表.如果hashCode()每次都返回相同的数,那么所有的对象都会被放到同一个bucket中,每次执行查找操作都会遍历链表,这样就完全失去了哈希的作用.所以我们最好还是提供一个健壮的hashCode()为妙.


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值