黑马程序员技术交流社区

标题: 有懂hashcode方法的吗? [打印本页]

作者: Tsinvat    时间: 2014-10-28 11:08
标题: 有懂hashcode方法的吗?
求前辈解答。老师讲哪个hashcode方法复写的时候,我弄不清楚为什么在年龄后面x一个数字呢?
public int hashCode()
        {
                return name.hashCode()+age*34;
        }

作者: sk0806    时间: 2014-10-28 11:59
为了保证不让不同对象的hashCode值不同,如果相同,还回去比较equals值,提高效率,X一个数字
作者: 刘家斌    时间: 2014-10-28 12:01
只是为了防止出现重复,name的hashcode大点,age小点和name小点,age大点,就有出现重复的可能,后面乘以倍数,将差距扩大,就是为了避免这种情况
作者: 英雄传说ER    时间: 2014-10-28 14:29
这个楼上大神已经解释的很清楚了 ,我来举个例子,应该更容易理解

如果 有个name的hashcode值是4,年龄的值16岁,
刚好 有个name的hashcode值是8,年龄的值12岁,

那么他们用hashcode()这个方法得到的值就是相同的,所以又要用其他方法来比较一次,才可以得出大小

如果后面的值*一个数 这样值得差距话就会变大,几乎不会出现判断不出大小的情况了
作者: 饼子    时间: 2014-10-28 18:54
哈希值用来存放元素的位置,如果两个元素的值一样了就冲突了,所以要尽量保证哈希值的唯一性。
作者: 郑飞    时间: 2014-10-29 02:04
这里随意发挥 宗旨是让所有元素hashCode尽量别重复
作者: Tsinvat    时间: 2014-10-29 07:35
英雄传说ER 发表于 2014-10-28 14:29
这个楼上大神已经解释的很清楚了 ,我来举个例子,应该更容易理解

如果 有个name的hashcode值是4,年龄的 ...

一个是 4 一个是8,hashcode值不相同呀,。hashcode比较完返回的是什么?是int吗?
作者: Tsinvat    时间: 2014-10-29 07:37
英雄传说ER 发表于 2014-10-28 14:29
这个楼上大神已经解释的很清楚了 ,我来举个例子,应该更容易理解

如果 有个name的hashcode值是4,年龄的 ...

一个是 4 一个是8,hashcode值不相同呀,hashcode值什么时候会相同?hashcode比较完返回的是什么?是int吗?
作者: Tsinvat    时间: 2014-10-29 07:38
刘家斌 发表于 2014-10-28 12:01
只是为了防止出现重复,name的hashcode大点,age小点和name小点,age大点,就有出现重复的可能,后面乘以倍 ...

是如何判断hashcode值的,每一个哈希值不都是不一样的吗?
作者: 英雄传说ER    时间: 2014-10-29 09:05
Tsinvat 发表于 2014-10-29 07:37
一个是 4 一个是8,hashcode值不相同呀,hashcode值什么时候会相同?hashcode比较完返回的是什么?是int ...

我说的是你的hashcode()方法  你还要知道你写这个方法的目的是什么,不就是用来覆盖object的hashcode方法来建立这个类的独特比较方法么,得到的hashcode当然是不一样的,object的hashcode是内存中的地址值,你当然不能用这个来比较学生,难道用new出来的学生对象在内存中的位置,来给他比大小么?显然不是,所以我们建立自己的hashcode方法去覆盖它,建立自己的规则去比较大小,他们两个人在地址用的位置不同,hashcode肯定是不同的,但是跟我们没关系,我们要的是他根据名字和年龄来比较大小的,这里只是借用了它名字的hasdcode ok?
一个是object的hashcode 一个是我们这个方法得到的hashcode
但是第二种才是我们想要的值,才是我们用来比较这个类的对象大小的依据。
作者: Tsinvat    时间: 2014-10-29 12:22
写的好详细,谢谢。




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