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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 熊永标 中级黑马   /  2013-1-9 21:05  /  1203 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. public int hashcode(Object obj1,Object obj2)
  2.         {
  3.                 final int prime = 31;
  4.                 int result = 1;
  5.                 result = prime * result + ((name == null) ? 0 : name.hashCode());
  6.                 result = prime * result + old;
  7.                 return result;
  8.         }
复制代码
请问当在复写对象的hashcode()方法时,乘上一个常量31,这是为什么呢

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

3 个回复

正序浏览
确实是为了保证唯一性!
举个例子吧,person类中计算哈希值用到name和age,这里把age看做Integer写的:如下
int hashcode = name.hashCode()+age.hashCode() ;
如果只是这样的话,可能会有一种情况就是person1对象的name哈希值等于12,age哈希值等于23 。
而另外一个person2对象的name哈希值是23,age哈希值是12 。这是两个对象的哈希值相等了,这个是不合理的吧!
此时我们如果把name或是age的哈希值乘以任意一个大于一的数,就可以极大的避免这种哈希值相同的情况出现。
不知道说清楚了没!
回复 使用道具 举报
乘以一个数和不乘以一个数有什么区别呢,最多也就使这个数变大而已,怎么就能使其唯一了呢
回复 使用道具 举报
这个是自定义的,你可以不用31的,用其他的也行,只是为了保证hashcode唯一
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马