2
回答
java 重写hasCode疑问???
注册华为云得mate10,2.9折抢先购!>>>   

如下是一个重写hasCode()的例子:

public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((firstName == null) ? 0 : firstName.hashCode());
		result = prime * result + ((lastName == null) ? 0 : lastName.hashCode());
		return result;
	}
想请问一下prime = 31??有什么作用的??为什么要用31,用别的数字代替行吗??求教,谢谢

<无标签>
举报
静心天涯
发帖于4年前 2回/255阅
共有2个答案 最后回答: 4年前

这很明显是一个自定义的判断方法,Java靠hashCode来确定Map容器的Key的。这里的31是一个魔法数,其实这里是打算用一个素数来进行计算的,也许是有某种意义,也许只是随便一选,就用了这个31。
质数又称素数。指在一个大于0的自然数中,除了1和此整数自身外,不能被其他自然数整除的数。因为合数是由若干个质数相乘而得来的,所以,没有质数就没有合数,由此可见素数在数论中有着很重要的地位。比1大但不是素数的数称为合数。1和0既非素数也非合数。质数是与合数相对立的两个概念,二者构成了数论当中最基础的定义之一。基于质数定义的基础之上而建立的问题有很多世界级的难题,如哥德巴赫猜想等。算术基本定理每一个比1大的数(即每个比1大的正整数)要么本身是一个素数,要么可以写成一系列素数的乘积,如果不考虑这些素数的在乘积中的顺序,那么写出来的形式是唯一的。这个定理的重要一点是,将1排斥在素数集合以外。如果1被认为是素数,那么这些严格的阐述就不得不加上一些限制条件。
100以内的质数有2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,在100内共有25个质数。


--- 共有 1 条评论 ---
静心天涯hasCode()方法是重写的,至于31,我看了很多hasCode的重写,都是用31的,至于素数和合数的定义,只要是学过数学的都知道,而我更想知道的是,素数到底有什么用??能为我们解决那些生活的问题??哥德巴赫猜想太难了,没几个懂的。 4年前 回复

据说是因为31是一个质数 同时 31=2^5-1   K*31=K*(2^5)-K

使用31的原因可能是为了更方便的为当前的对象分配内存地址(这个数字不大不小) 减少hash冲突 提高查询速度等  

顶部