黑马程序员技术交流社区
标题:
覆盖hashCode方法的疑问
[打印本页]
作者:
xyh19
时间:
2013-3-22 16:18
标题:
覆盖hashCode方法的疑问
本帖最后由 徐彦淏 于 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 16:30
你在hashSet中存储对象,它就是hashcode值与equals方法进行判断唯一性的,如果你不覆盖,那么你存的
对象永远不会重复,就算是性命年龄相同也会存储,这个根据你的条件而定
至于return name.hashCode()+sum*78;
这个你可以随便弄 这只是一种规范而已
作者:
李尧
时间:
2013-3-22 16:33
首先我们需要明白 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 这个随意了...
作者:
戴乾刚
时间:
2013-3-22 16:44
java中每个对象都有个hashCode方法,这个方法其实是为一种特殊存储结构(集合)下查找元素方便而设的。当不涉及在集合下查找对象的时候,那么这个方法也就没什么作用了。
本身这种方法称作哈希定址法。集合作为一块没有没有任何规则散列存储元素的区域。我们无法像ArrayList那样可以一个个按照顺序来存放元素(ArrayList底层通过数组来实现的),同样也不能像LinkedList一样来查找一个元素,因为元素间的关系是散列存放的,不存在先后关系。但是存储大批量数据时候,我们也没有必要保存它们间的先后关系。
set是一块区域(一般比较大的区域),我们要存放一个元素,同时存入后我们也想取出该元素,所以就定义了一种方法,对每个要放入的元素就行一种运算,算出一个‘第一无二’的值,根据这个独一无二的值来确定这个这个值存储的位置。在Java中按照面向对象的思维来看,这个计算hash值的方法应该是由对象本身来算的。所以每个元素(即Java中的对象)有一个hashCode方法。
当一个类覆盖了equals方法时,就有必要覆盖hashCode方法,而且两个元素如果equals的话,它们的hashCode方法返回的值必须是一样的。
至于哈希值的计算不是固定的,*78只是为了不让不同元素的哈希值相同
作者:
xyh19
时间:
2013-3-22 19:33
谢谢楼上的朋友们,问题已解决
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2