
在HashMap中hashcode生成的代码中,竟然有一个31的固定值,这是为什么呢,这个咱们可以来看国外大神在stackoverflow上的回答。
其中点赞数最高的是下面这个回答:

这个在理论的高度上做出了解释,好像还是不是很有实战意义,来看第二个呼声最高的回答

这个回答就相当具有实战意义了,只要我们本地准备单词表,就能对31,33,37,39和41这些样本进行逐个测试。





测试结果如图,乘数31,hash碰撞概率到达临界点突然下降很多。但是下面蓝色框内碰撞概率更小,为何不采用呢?原因其实也很简单,因为hashcode算法用到的乘积值越大,随之带来的
就是精度缺失的风险加大。
HashCode算法取31为还可以让数据分布更加散列。直接看代码吧,我们可以本地做个测试



可以看到乘数为31,数据表上凹槽更多,也就说明数据分布较均匀,达到了数据散列的目的,这个在hashmap中的应用,帮助hashmap成为性能极高的数据结构。 |