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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© xyh19 高级黑马   /  2013-3-22 16:18  /  2251 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 徐彦淏 于 2013-3-22 19:33 编辑

初始化数据时候,这个为什么要覆盖hashCode方法?
覆盖的时候,有为什么要返回 name.hashCode()+sum*78?
希望有朋友能帮忙解答一下。
public String getName()
        {
                return name;
        }
public int hashCode()
        {
                return name.hashCode()+sum*78;
        }

点评

如果你的问题已经得到解决,请及时将主题改为[已解决],如果还有问题请继续追问,谢谢!  发表于 2013-3-22 17:46

评分

参与人数 1技术分 +1 收起 理由
贾文泽 + 1

查看全部评分

4 个回复

正序浏览
谢谢楼上的朋友们,问题已解决
回复 使用道具 举报
java中每个对象都有个hashCode方法,这个方法其实是为一种特殊存储结构(集合)下查找元素方便而设的。当不涉及在集合下查找对象的时候,那么这个方法也就没什么作用了。

   本身这种方法称作哈希定址法。集合作为一块没有没有任何规则散列存储元素的区域。我们无法像ArrayList那样可以一个个按照顺序来存放元素(ArrayList底层通过数组来实现的),同样也不能像LinkedList一样来查找一个元素,因为元素间的关系是散列存放的,不存在先后关系。但是存储大批量数据时候,我们也没有必要保存它们间的先后关系。

   set是一块区域(一般比较大的区域),我们要存放一个元素,同时存入后我们也想取出该元素,所以就定义了一种方法,对每个要放入的元素就行一种运算,算出一个‘第一无二’的值,根据这个独一无二的值来确定这个这个值存储的位置。在Java中按照面向对象的思维来看,这个计算hash值的方法应该是由对象本身来算的。所以每个元素(即Java中的对象)有一个hashCode方法。

当一个类覆盖了equals方法时,就有必要覆盖hashCode方法,而且两个元素如果equals的话,它们的hashCode方法返回的值必须是一样的。

至于哈希值的计算不是固定的,*78只是为了不让不同元素的哈希值相同

评分

参与人数 1技术分 +1 收起 理由
贾文泽 + 1

查看全部评分

回复 使用道具 举报
首先我们需要明白 hashCode()方法的作用.例如,在HashSet集合中,如何保证元素的唯一性的呢?就是首先通过hashCode方法,计算两个元素的hashcode是否相同.默认情况下HashCode就是用内存地址来计算的,不同的对象必然哈希值是不同的.
那么现在我需要它按照我指定的方式去比较,例如按照对象的name和sum来比较,那么我就需要复写hashCode().
覆盖的时候,有为什么要返回 name.hashCode()+sum*78?因为 有可能出现下面这种情况
name1.hashCode()=2 sum1=1
name2.hashCode()=1 sum2=2
name和sum都不相同,但是计算出的哈希值却相同,所以+sum*78 这样避免了不同的对象得出相同的哈希值.你也可以不乘以78 这个随意了...

评分

参与人数 1技术分 +1 收起 理由
贾文泽 + 1

查看全部评分

回复 使用道具 举报
你在hashSet中存储对象,它就是hashcode值与equals方法进行判断唯一性的,如果你不覆盖,那么你存的
对象永远不会重复,就算是性命年龄相同也会存储,这个根据你的条件而定
至于return name.hashCode()+sum*78;
这个你可以随便弄 这只是一种规范而已
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马