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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 苏格拉底的弟子 黑马帝   /  2012-1-4 11:07  /  2396 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 苏格拉底的弟子 于 2012-1-5 22:34 编辑

集合框架里面的set集合里面数据结构是哈希表结构的,假如定义了一个Person类如下,往hashSet集合中存入自定对象姓名和年龄相同为同一个人,重复元素。
class Person
{
        private String name;
        private int age;
        Person(String name,int age)
        {
                this.name = name;
                this.age = age;
        }
       
        public int hashCode()
        {
                System.out.println(this.name+"....hashCode");
                return name.hashCode()+age*37;
        }

        public boolean equals(Object obj)
        {

                if(!(obj instanceof Person))
                        return false;

                Person p = (Person)obj;
                System.out.println(this.name+"...equals.."+p.name);

                return this.name.equals(p.name) && this.age == p.age;
        }

问题是为什么复写equals后 还要复写hashcode呢?   不复写hashcode 可以吗?

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

4 个回复

倒序浏览
其实你就调用Object的hashCode方法就行了。这个值本来就是一个经验值,爱怎么定义就怎么定义的。
  1. public int hashCode()
  2.         {
  3.                 System.out.println(this.name+"....hashCode");
  4.                 return name.hashCode();
  5.         }
复制代码
当使用Set时会调用hashcode()方法算出对象的值并与set中的对象的hashcode值比较,如果不同则加入。如果相同,再调用equals()方法 true则不加入,反之加入。

评分

参与人数 1技术分 +1 收起 理由
吴上储 + 1

查看全部评分

回复 使用道具 举报
     在我们往HashSet里面添加对象(add()方法里的参数都是对象)的时候,在Add()的方法内部,它首先调用该对象的hashCode()方法(hashCode方法用来计算该对象的哈希码),如果返回的哈希码与集合已存在对象的哈希码不一致,则add()方法认定该对象没有与集合中的其它对象重复,那么该对象将被添加进集合中。如果hashCode()方法返回的哈希码与集合已存在对象的哈希码一致,那么将调用该对象的equals方法,进一步判断其是否为同一对象。之所以在进行了hashcode(哈希码)的比较后,又调用equals()方法进行比较,是因为虽然HashSet采用的是通过hashcode来区分对象,但是在java中hashcode会重码(即不同的对象,其hashcode可能会相同) name.hashCode()+age*37中 name.hashCode()和age*37可能同时不一样但相加在一起就有几率会相同。

评分

参与人数 1技术分 +1 收起 理由
吴上储 + 1

查看全部评分

回复 使用道具 举报
往HashSet里面添加对象的时候,在Add()的方法内部,它首先调用该对象的hashCode()方法比较是否一样,如果一样那么就会继续调用equals方法。所以也要覆盖hashCode方法。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
其他人还有见解吗
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马