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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 齐连涛 中级黑马   /  2012-10-20 10:46  /  1747 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 齐连涛 于 2012-10-31 10:53 编辑

如下代码,为什么age*39就能尽量保证哈希值不同呢?

        public int hashCode()
        {
               
                return  name.hashCode()+age*39;
        }

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

5 个回复

倒序浏览
这是一个关于哈希算法的问题,乘以39是因为避免%运算时重复,更能清楚效果。

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

回复 使用道具 举报
我是这么理解的:乘以39只是为了增大值差

比如说,30+20结果为50     10+40结果也为50   但(30 20)是!=(10 40)的   //就如name.hashCode()+age

而乘以39可以大大避免这种情况  (30+20*39)   !=   (10+40*39)  //也就大大避免了俩对象name.hashCode  

、age值都不同而相加结果却相同的"意外"的发生.

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

回复 使用道具 举报
age*39 这个39 不是固定的 只要不是1 的数都可以

1.在存数据到Set集合时 要保证数据的唯一性
2.先执行hashCode方法 在执行equals方法
3.hashCode方法是根据底层的哈希算法 来返回一个哈希值
4.假如有两个元素是同一个name 调用了hashCode方法得到一个值是相等的 这时就要调用equals方法来比较
  他们的age是不是一样
5.当调用hashCode方法是返回的哈希值不一样 就不用继续调用equals方法了
   

方法一:public int hashCode()

                {

                      System.out.println(this.name+"....hashCode");

                       return name.hashCode();

             }

如果元素的name一样他们就会继续调用equals方法

方法二:
public int hashCode()

                {

                      System.out.println(this.name+"....hashCode");

                       return name.hashCode()+age*39;

             }

当name相同时再加上他们的age作比较 如果还想到的话就说明这两元素是同一个  就不用继续调用equals方法了这样提高了效率
age*39 原因是: name1=2  age1=5  而name2=5  age=2   虽然他们不是同一个元素但是他们在调用了方法二后返回的哈希值是相等的 为了避免这种错误的情况发生  所以在age上乘一个数

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

回复 使用道具 举报
  1. package com.itheima;

  2. public class Test2 {
  3.         /**
  4.          * 第二题,编写一个方法(名字自定,但要符合Java编码规范), 方法内打印一字符串,并在main()方法中调用它
  5.          */
  6.         public static void Read() {
  7.                 System.out.println("这里是所要打印的字符串!");
  8.         }

  9.         public static void main(String[] args) {
  10.                 Read();
  11.         }

  12. }
复制代码
回复 使用道具 举报
两个不同的对象,要使他们的hashcode不同
对于不同的对象,其名字一般不同,这时返回的name的hashcode是不同的
但对于相同名字,年龄不同的,仍认为是两个不同对象,所以采用name+age的方式

但是对于两个不同名又不同年龄的对象,这种方式还可能会出现相同hashcode的情况:
姓名+年龄(hashcode):一个是10+20,另一个是12+18.
这种情况也不合理,如果在年龄上乘一个权数(39),本来二者相差2,现在相差78,会是这种情况出现的概率大大降低。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马