如何重写hashcode()方法

lhx1026 2009-06-16 03:20:28
如题所示,请大侠们多多发言啊?
...全文
6375 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
home_wanli 2012-06-27
  • 打赏
  • 举报
回复
还是不懂。。尤其是hashcode的重写。。。
javaengineerkang 2010-09-17
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 w5644266 的回复:]
引用 1 楼 knightzhuwei 的回复:

在java的集合中,判断两个对象是否相等的规则是:


首先,判断两个对象的hashCode是否相等

如果不相等,认为两个对象也不相等
如果相等,则判断两个对象用equals运算是否相等
如果不相等,认为两个对象也不相等
如果相等,认为两个对象相等


Java code
package test;

publi……
[/Quote]



@Override
public int hashCode(){
return a.hashCode();
}
luats 2009-09-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 knightzhuwei 的回复:]

在java的集合中,判断两个对象是否相等的规则是:


首先,判断两个对象的hashCode是否相等

如果不相等,认为两个对象也不相等
如果相等,则判断两个对象用equals运算是否相等
如果不相等,认为两个对象也不相等
如果相等,认为两个对象相等
[/Quote]
package test;

public class TestHashCode {
private int a;

public TestHashCode(int b){
this.a = b;
}
// @Override
// public int hashCode(){
// return a;
// }
@Override
public boolean equals(Object o){
return o instanceof TestHashCode && (a == ((TestHashCode)o).a);
}

public int getA() {
return a;
}

public void setA(int a) {
this.a = a;
}
}

public class Test {
public static void main(String[] args){
//测试hashCode
TestHashCode test1 = new TestHashCode(1);
TestHashCode test2 = new TestHashCode(1);
System.out.println(test1.equals(test2));
System.out.println(test1.hashCode());
System.out.println(test2.hashCode());
}
}


我的这个重写的hashCode()方法貌似没起到作用...还望帮小弟解释下.
sangshusen_1988 2009-06-16
  • 打赏
  • 举报
回复
一般都是根据业务主键值去重写equals方法.
最好别自己写,让eclipse根据字段自动生成就好了
possibleonline 2009-06-16
  • 打赏
  • 举报
回复
一般重写equals方法必须重写hashcode方法,反之刚不一定
Adebayor 2009-06-16
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 oklinsong 的回复:]
简单的重写只要返回一个int值就行,但涉及到你的逻辑,就要考虑你要在什么情况下让两个对象equals相等。
[/Quote]
是的 需要根据你的业务逻辑来重写HashCode方法
oklinsong 2009-06-16
  • 打赏
  • 举报
回复
简单的重写只要返回一个int值就行,但涉及到你的逻辑,就要考虑你要在什么情况下让两个对象equals相等。
阿士匹灵 2009-06-16
  • 打赏
  • 举报
回复
阿士匹灵 2009-06-16
  • 打赏
  • 举报
回复
up
wangljgood 2009-06-16
  • 打赏
  • 举报
回复
简单一点说:
Object中的hashCode()方法在我们创建对象的时候为每个对象计算一个散列码,这个散列码是唯一的,所以如果2个对象的散列码相同,那他们一定是同一个对象。
自己定义的类也可以重写hashCode()方法,按照自己定义的算法计算散列码的生成。

Object中的equals()方法,比较的是2个对象的引用地址,包括他们各自的散列码,如果不同,就认为是不同的对象。
String类中重写了equals方法,比较的是他们字符串的内容。
lhx1026 2009-06-16
  • 打赏
  • 举报
回复
那跟hashcode()方法对应的equals()方法的重写是像这个一样的吗?
public class EntBlockGroup{
private int group_id;
private String group_name;
private int block_type_id;

@Override
public boolean equals(Object obj) {
// TODO Auto-generated method stub
return (obj instanceof EntBlockGroup)&&(group_id==((EntBlockGroup)obj).group_id)&&(block_type_id==((EntBlockGroup)obj).block_type_id);
}
}
sunwei0325 2009-06-16
  • 打赏
  • 举报
回复
think in java 里面有呢:
1.给int变量赋值
2.为对象中每个有意义的字段计算出一个散列码
3.合并
4.返回结果
5.验证结果,确保相同的对象有相同的散列码

public class Test {
private String s = null;
private int id = 0;
.
.
.
public int hashCode() {
int result = 17;
result = 37 * result + s.hashCode();
result = 37 * result + id;
return result;
}
}
knightzhuwei 2009-06-16
  • 打赏
  • 举报
回复
参考http://allenwei.javaeye.com/blog/228867
什么要重写hashCode方法?



我们应该先了解java判断两个对象是否相等的规则。



在java的集合中,判断两个对象是否相等的规则是:


首先,判断两个对象的hashCode是否相等

如果不相等,认为两个对象也不相等
如果相等,则判断两个对象用equals运算是否相等
如果不相等,认为两个对象也不相等
如果相等,认为两个对象相等



我们在equals方法中需要向下转型,效率很低,所以先判断hashCode方法可以提高效率



如何重写hashCode方法呢?



你可以写

Java代码
public int hashCode(){
return 42;
}

public int hashCode(){
return 42;
} 这是一种符合规则的写法,保证了两个equal 的object 拥有相同的hashCode

但这种方法显然是不可取的



比较通用的做法是

返回一个result



Java代码
public int hashCode() {
int result = 17; //任意素数
result = 31*result +c1; //c1,c2是什么看下文解释
result = 31*result +c2;
return result;
}

public int hashCode() {
int result = 17; //任意素数
result = 31*result +c1; //c1,c2是什么看下文解释
result = 31*result +c2;
return result;
} 其中c1,c2是我们生成的你要计算在内的字段的代码,生成规则如下:

如果字段是boolean 计算为(f?1:0);

如果字段是byte,char,short,int则计算为 (int)f;

如果字段是long 计算为 (int)(f^(f>>32));

如果字段是float 计算为 Float.floatToLongBits(f);

如果字段是一个引用对象,那么直接调用对象的hashCode方法,如果需要判空,可以加上如果为空就返回0;
如果字段是一个数组则需要遍历所有元素,按上面几种方法计算;



当你写完后hashCode方法后问问自己

1、是否两个equal的实例,拥有相同的jhashCode

2、两个不同的实例,是否拥有相同的hashCode

写一个JUnit Test 测试一下

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧