A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Tsinvat 中级黑马   /  2014-10-28 11:08  /  1501 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

求前辈解答。老师讲哪个hashcode方法复写的时候,我弄不清楚为什么在年龄后面x一个数字呢?
public int hashCode()
        {
                return name.hashCode()+age*34;
        }

10 个回复

倒序浏览
为了保证不让不同对象的hashCode值不同,如果相同,还回去比较equals值,提高效率,X一个数字
回复 使用道具 举报
只是为了防止出现重复,name的hashcode大点,age小点和name小点,age大点,就有出现重复的可能,后面乘以倍数,将差距扩大,就是为了避免这种情况
回复 使用道具 举报
这个楼上大神已经解释的很清楚了 ,我来举个例子,应该更容易理解

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

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

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

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

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

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

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

是如何判断hashcode值的,每一个哈希值不都是不一样的吗?
回复 使用道具 举报
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
但是第二种才是我们想要的值,才是我们用来比较这个类的对象大小的依据。
回复 使用道具 举报
写的好详细,谢谢。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马