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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

class Person2
{
        private String name;
        private int age;
        Person2(String name,int age)
        {
                this.name=name;
                this.age=age;
        }

        public int hashCode() {
                return name.hashCode()+age*51; //在自定义储存类型中,这里为什么要这样写?哈希值还不能确定唯一性
        }                                                                   //平常应该做么写?为什么后面加了一个数?
        @Override
        public boolean equals(Object obj) {
                //这里不是要问的。。。。
                return true;
        }

}

覆盖hashCode方法时?为什么要在hashCode后面加一个数?那个数是怎么加的?

评分

参与人数 1技术分 +1 收起 理由
黄兴旺 + 1

查看全部评分

2 个回复

倒序浏览
本帖最后由 垂天云 于 2013-9-10 14:41 编辑

比如说张三年龄是30岁(哈希值120),李斯是40岁(哈希值150),张三的字符串哈希值是80,加上年龄的是200,李斯字符串的哈希值是50,加上年龄的也是200!!!这样就哈希值重复了,还要判断equals,比较低效。
所以就在后面乘以一个值,这样更高效一些,不用判断equals,但是要保证乘以数字后的值,不要超出数据类型的的最大范围。
毕老师视频讲得很详细的,嘿嘿!
回复 使用道具 举报
public int hashCode() {
      return name.hashCode()+age*51; //在自定义储存类型中,这里为什么要这样写?哈希值还不能确定唯一性
}   
      楼主,你这里定义的使一个人的类,定义这个类的目的使存储进HashSet类型的集合当中去。
一般来讲,new出来的任何一个Person类都有自己独立的哈希值。如果不复写hashcode()函数,
那么所有的Person对象都存进HashSet集合当中。
      但是需要根据年龄和时间相同来判断是否是同一个人,如果使同一个人就不能存进集合中。
所以重新定义hashCode方法只是为了根据我们的需求(name相同,age相同)来判断是不是同
一个人。
希望对你有帮助。。。

评分

参与人数 1技术分 +1 收起 理由
黄兴旺 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马