日期:2014-05-20  浏览次数:20670 次

如何重写hashcode()方法
如题所示,请大侠们多多发言啊?

------解决方案--------------------
参考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 测试一下


------解决方案--------------------
think in java 里面有呢:
1.给int变量赋值
2.为对象中每个有意义的字段计算出一个散列码
3.合并
4.返回结果
5.验证结果,确保相同的对象有相同的散列码
Java code

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;
    }
}

------解决方案--------------------
简单的重写只要返回一个int值就行,但涉及到你的逻辑,就要考虑你要在什么情况下让两个对象equals相等。
------解决方案--------------------
一般都是根据业务主键值去重写equals方法.
最好别自己写,让eclipse根据字段自动生成就好了