黑马程序员技术交流社区

标题: 如何提高hashCode()方法返回值的唯一性 [打印本页]

作者: 郑齐育    时间: 2013-10-14 19:30
标题: 如何提高hashCode()方法返回值的唯一性
本帖最后由 郑齐育 于 2013-10-15 10:13 编辑

在集合视频中讲到为了尽量保证hashCode()返回值的唯一性,复写hashCode()的代码为public int hashCode(){   return name.hashCode()+age*39;
}
这里age*39如何能减少函数返回值相同的可能性?
假设对象一的name.hashCode()返回为a,age为b,第二个对象的name.hashCode()返回为c,age为d,那么我问的问题就是。由a+b=c+d 和a+nb=c+nd有关系。或者说凭什么说a+nb=c+nd的可能性小于a+b=c+d.
作者: 周志龙    时间: 2013-10-14 19:31
还有equals方法的作用呢
作者: To    时间: 2013-10-14 19:32
好快的加分速度
作者: 郑齐育    时间: 2013-10-14 19:39
仇邓强 发表于 2013-10-14 19:32
好快的加分速度

假设对象一的name.hashCode()返回为a,age为b,第二个对象的name.hashCode()返回为c,age为d,那么我问的问题就是。由a+b=c+d 和a+nb=c+nd有关系。或者说凭什么说a+nb=c+nd的可能性小于a+b=c+d.
没加这句话提问有些人我想问的都不会想到。
作者: 郑齐育    时间: 2013-10-14 19:43
周志龙 发表于 2013-10-14 19:31
还有equals方法的作用呢

问题是加了一个倍数又不会影响到name.hashCode()和age的值,对equals()有什么影响?
作者: 赖波    时间: 2013-10-14 19:53
我举个粟子
5+3=4+4
5+3*3=4+4*3    ?
明显第一个相等只要和相等就相等
第二个,就排除了第一种情况
作者: 郑齐育    时间: 2013-10-14 20:13
赖波 发表于 2013-10-14 19:53
我举个粟子
5+3=4+4
5+3*3=4+4*3    ?

你说的有一定道理,但还不够具体,谢谢了  当a+b=c+d时可得a-c=b-d当a+nb=c+nd时可得a-c=n(b-d)也就是说a-c的可能差值会随着n的变大而变大,满足条件的a,c取值也变少了。有没有人还有其它看法。
作者: 赖波    时间: 2013-10-14 21:42
老师把对象的hasCode()设为name.hashCode()+age*39;的目的是减少产生相同的,
只设
hasCode()=name.hashCode()和别的对象hasCode相同可能性大
hasCode()=name.hashCode()+age和别的对象hasCode相同可能性减小
hasCode()=name.hashCode()+39*age和别的对象hasCode相同,再一次减小,尽量的减少,两数大小之间的互补
你要搞成n(b-d)--->>n(name.hashCode()-age)这样的话数n没有作用
b-d同样存在大小互补。
作者: 做只会飞的鱼    时间: 2013-10-15 07:09
怎么感觉是个数学题...
概率:
2+13=12+3=13+2=14+1=15+0

13+2*13=-13+3*13
那么随着n的变大,同一段整数内,能满足a+b*n=b+a*n的数字a和b会越来越少
作者: 郑齐育    时间: 2013-10-15 10:13
本质上就是数学题,编程里面设计到算法效率的时候就是数学了。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2