重写hashcode的原因 以及为啥用31的个人理解

重写hashCode()方法对于Java集合如Set、HashMap的性能至关重要,因为它决定了对象存储的位置和查询效率。如果返回常量,会导致所有元素聚集在同一存储区域,降低查询速度。未重写时,即使对象相等,由于hashCode不同,可能导致HashSet中无法正确查找到对象。通常使用素数31作为系数,因为31可以用位移运算高效表示(i31 == (i << 5) - 1),且虚拟机对此做了优化,兼顾效率和内存占用。
摘要由CSDN通过智能技术生成

首先声明自己大部分的理解的出处:如何重写hashCode()方法
接下来自己的理解:
1、首先java中set 、HashMap貌似包括List等底层的存储都会把存储区域分成n个部分,而具体存在哪个部分是由hashcode决定的,也就是说查询的时候他会通过hashcode 所有小查询范围,所以如果所有的hashcode都一样,你的hashcode返回了一个常量 ,那么结果就是存储进去以后 都存放在一个区域,查询的时候变成了一个链式查询,完全没有效率。

2、如果你的hashcode返回的是一个随机数,或者不去重写hashcode,那么即使两个对象是一样的,也会出现问题。举个例子(应用自上面的博客):
我们先创建2个新的Coder对象:

Coder c1 = new Coder("bruce", 10);  
Coder c2 = new Coder("bruce", 10); 

假定我们已经重写了Coder的equals()方法而没有重写hashCode()方法:

@Override  
02.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值