A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 周飞 中级黑马   /  2012-9-10 11:04  /  1338 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. class MyStudent {
  2.         private String name;
  3.         private int age;
  4.         public int hashCode() {
  5.                 return name.hashCode() + age*88;
  6.         }       
  7.         MyStudent(String name,int age) {
  8.                 this.setName(name);
  9.                 this.setAge(age);
  10.         }
  11. ………………………………………………………………
复制代码
这是部分代码,返回的时候记得要用age剩一个数,原理不知道,谁帮我解释下!

4 个回复

正序浏览
罗磊 发表于 2012-9-10 11:12
其实老师都说啦!就是使这个对象的hash值尽量变得唯一,就如:如果name 算得的hash值 为50 age 为10 那么50 ...

就是要这个,忘了视频上的解释了,呵呵
回复 使用道具 举报

为什么要重写hashCode方法?



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



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


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

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



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



如何重写hashCode方法呢?



你可以写



Java代码  
1.public int hashCode(){  
2.  return 42;  
3.}  

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

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



比较通用的做法是

返回一个result





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

其中c1,c2是我们生成的你要计算在内的字段的代码,生成规则如下:

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

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

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

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

如果字段是一个引用对象,那么直接调用对象的hashCode方法,如果需要判空,可以加上如果为空就返回0;
如果字段是一个数组则需要遍历所有元素,按上面几种方法计算;
回复 使用道具 举报
其实老师都说啦!就是使这个对象的hash值尽量变得唯一,就如:如果name 算得的hash值 为50 age 为10 那么50+10=60 ;而另一个对象的 name 算的hash值 为40 而age为20 那么 40+20 = 60; 那么对象的hash值不就一样了么, 所以为了尽量让hash值唯一  age乘一个数  如 50+10*3 =80;40+20*3=100;
回复 使用道具 举报
没有什么原理,hashcode就是要返回一个数,name是String类型的,本身已经重写了hashcode;
age*88表示生成与age相关的一个数,name.hashcode表示与name相关的一个数,两者相加,表示这个类对象的hashcode是与name与age域相关的.
你不乘也可以,乘任何数都可以
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马