黑马程序员技术交流社区

标题: 集合中的hashCode方法自动调用equals方法吗? [打印本页]

作者: 杜明辉    时间: 2012-1-27 18:15
标题: 集合中的hashCode方法自动调用equals方法吗?
本帖最后由 杜明辉 于 2012-2-2 13:41 编辑

想问大家一个问题,集合中的hashCode方法在算完哈希值后,自动调用equals方法进行判断吗?
如果不是,为什么没看到equals方法的调用?
查了api文档,但没看懂。有高手吗?求解.......


class HashSetTest
{
        public static void sop(Object obj)
        {
                System.out.println(obj);
        }
        public static void main(String[] args)
        {
                HashSet hs = new HashSet();

                hs.add(new Person("a1",11));
                hs.add(new Person("a2",12));
                hs.add(new Person("a3",13));
                hs.add(new Person("a1",11));
                hs.add(new Person("a2",12));
                       
                Iterator it = hs.iterator();

                while(it.hasNext())
                {
                        Person p = (Person)it.next();
                        sop(p.getName()+"::"+p.getAge());
                }
        }
}
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;
        }
        public String getName()
        {
                return name;
        }
        public int getAge()
        {
                return age;
        }
}
作者: 杜明辉    时间: 2012-1-27 18:30
没人顶?没人答? 我晕。。。。。自己顶
作者: 黄秋    时间: 2012-1-27 20:17
  集合中的hashCode方法、equals方法是两个作用不同的方法。顾名思义,hashCode是判断hash值是否相等,equals判断元素的值是否相等。既然它们是独立的方法,作用也不同,hashCode方法自然不会自动调用equals方法。都是比较是否相等,有时会混淆。
  在判断两个元素是否相同时,会用到其中一个,或两个,这样它们又扯在一起了。由于集合的唯一性,在向集合添加元素时,要判断集合中是否有此元素。先用Hashcode方法得到哈希值,就是元素所在引用的地址值,如两元素的哈希值不等,就直接加入集合;如相等,再用equals来判断这两个对象是否相等,若equals等,就是相同了。
  哪为什么要用Hashcode呢?它快速呀,这个可找些资料看看。
作者: 逄焕玮    时间: 2012-1-28 00:07
HashSet是通过hashCode()和equals()这两个方法来确保集合中元素的唯一性的
集合中的hashCode方法在算完哈希值后,自动调用equals方法进行判断吗?

并不是hashCode()方法去调用equals()方法的,而是HashSet在添加,删除以及判断时,这些方法会自动调用hashCode()和equals()的
拿添加元素的方法boolean add(E e) 来说,当调用add()方法时,会先调用hashCode()计算哈希值
   如果元素的hashCode()值不同,就不必再去调用equals(),哈希值不同,就直接当成不同的元素存入HashSet了
   如果元素的hashCode()值相同,才会调用equals()继续判断是否相同,不同的话,会当成不同的元素存入HashSet,相同的话就是HashSet中已经存在该元素了
boolean contains(Object o) 判断此 set 包含指定元素  以及  boolean remove(Object o) 移除元素 也都需要用这俩方法判断的

如果不是,为什么没看到equals方法的调用?

我拷了你的代码运行了一下,结果中
a1....hashCode
a2....hashCode
a3....hashCode
a1....hashCode
a1...equals..a1
a2....hashCode
a2...equals..a2
a1::11
a3::13
a2::12
有equals()方法被调用的输出说明啊




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2