下面是求HashCode的一段代码,请高手能解释一下这种算法的原理与优点
public int hashCode()
{
if (this.hashValue == 0)
{
int result = 17;
int idValue = this.getId() == null ? 0 : this.getId().hashCode();
result = result * 37 + idValue;
this.hashValue = result;
}
return this.hashValue;
}
public int hashCode()
{
if (this.hashValue == 0)
{
int result = 17;
int idValue = this.getId() == null ? 0 : this.getId().hashCode();
result = result * 37 + idValue;
this.hashValue = result;
}
return this.hashValue;
}
// hashCode为每一个对象生成一个散列码
// 一般为关键属性乘以一个质数
/*
在java的集合中,判断两个对象是否相等的规则是:
1,判断两个对象的hashCode是否相等
如果不相等,认为两个对象也不相等,完毕
如果相等,转入2
2,判断两个对象用equals运算是否相等
如果不相等,认为两个对象也不相等
如果相等,认为两个对象相等
*/
// hashcode方法不保证为不同的对象必然生成不同的hash码
// 如果x.equals(y)返回“true”,那么x和y的hashCode()必须相等。
// 如果x.equals(y)返回“false”,那么x和y的hashCode()有可能相等,也有可能不等。
这个不叫什么算法吧,重写hashcode()的同时一般也要重写equals()方法,两者配合进行对象的比较(一般针对自定义的java对象)
而至于说hashCode的算法,简单而有效的方法应该就是这种利用多项式生成吧,最好加一个prime的数,主要是保证两个认为不相等的实体,不会相等。
int idValue = this.getId() == null ? 0 : this.getId().hashCode();
result = result * 37 + idValue;
你这个代码是不是写错了,result*37不就是一个常数吗,有必要这么做吗?
在java中,hashcode更像是被作为了一个对象的标识符(这么说不正确但是比较切合实际),在别的地方可能我们都看不到hashcode这个方法的作用,但是在容器中,他的价值就体现了,通过对象本身的hashcode运算直接得到了该对象在链表中的偏移量,提高了查找的速度。
之所以选择result*37,是因为它是一个奇素数,如果乘数是偶数,并且乘法溢出的话,则信息会丢失,因为与2相乘等价于移位运算。在一般情况下,使用素数的好处并不明显,但是习惯上使用素数来计算散列结果。”
//在上班,大概写了下~应该问题不大!
public int hashCode()
{
if (this.hashValue == 0)
{
int result = 17;
int idValue = this.getId() == null ? 0 : this.getId().hashCode(); //这里说明,假如this.getId() 返回的是NULL,说明它们的hashCode一样!假如不是null,那就调用this.getId()的hashCode方法!不知道这个是Integer还是String,这样保证假如ID一样,保证他们的hashcode一样!都是null也保证他们的hashcode一样!
result = result * 37 + idValue; //这里就不说了
this.hashValue = result;
}
return this.hashValue;
}
看看这里,又帮助!
http://topic.csdn.net/u/20070101/20/6315cbf9-43fd-485e-9bb8-47efa4cd0668.html
搜索功能要利用起来,hoho~
算法怎么实现就不知道.....有待研究
从表面上来看 只是对hashCode()做了一个不算复杂的重写。
按照算法的规则来生成散列码
我想问下hascode判断相等有什么关系么?
楼主【LMXEQ5】截止到2008-07-07 10:04:10的历史汇总数据(不包括此帖):
发帖的总数量:4 发帖的总分数:100
结贴的总数量:3 结贴的总分数:50
无满意结贴数:2 无满意结贴分:120
未结的帖子数:1 未结的总分数:50
结贴的百分比:75.00 % 结分的百分比:50.00 %
无满意结贴率:66.67 % 无满意结分率:240.00%
楼主加油