`
allenwei
  • 浏览: 87697 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

关于如何重写hashCode的方法

阅读更多

为什么要重写hashCode方法?

 

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

 

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


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

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

 

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

 

如何重写hashCode方法呢?

 

你可以写

public int hashCode(){
  return 42;
}

 这是一种符合规则的写法,保证了两个equal 的object 拥有相同的hashCode

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

 

比较通用的做法是

返回一个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 测试一下

14
0
分享到:
评论
6 楼 lz12366 2010-07-23  
按你这么说

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

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

Object==object
两个对象比较是这样比较的
比比较hashcode
然后equals
最好确定是否==
你自己试试 就知道了
  这样说是不对的额

5 楼 jessige_27 2008-12-30  
有的对象很麻烦的 包含好多基本类型的数据 也那么写hashCode么 有点崩溃啊
4 楼 SwellHuang 2008-11-16  
另外17是任意素数,那31是什么呢?
3 楼 SwellHuang 2008-11-16  
引用
其中c1,c2是我们生成的你要计算在内的字段的代码,生成规则如下:
如果字段是boolean 计算为(f?1:0);
如果字段是byte,char,short,int则计算为 (int)f;
如果字段是long 计算为 (int)(f^(f>>32));
如果字段是float 计算为 Float.floatToLongBits(f);
如果字段是一个引用对象,那么直接调用对象的hashCode方法,如果需要判空,可以加上如果为空就返回0;
如果字段是一个数组则需要遍历所有元素,按上面几种方法计算;


为什么按照这个规则就能保证
引用
1、是否两个equal的实例,拥有相同的jhashCode
2、两个不同的实例,是否拥有相同的hashCode


能讲解一下吗?谢谢!
2 楼 allenwei 2008-08-17  
两个集合就要遍历所有元素,对每个元素按以上方法比较
1 楼 jiyanliang 2008-08-17  
这里的比较还是简单了点
如果是两个集合比较呢

相关推荐

Global site tag (gtag.js) - Google Analytics