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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© -_-# 中级黑马   /  2014-6-12 22:16  /  1166 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

今天学到java的关于集合框架的最后面。。讲到哈希这边。。。有个程序。有个小地方没听明白
下面是代码
class Person
{
        private String name;
        private int age;
        Person(String name,int age)
        {
                this.name=name;
                this.age=age;
       
        }
       
       
        public String getName()
        {
                return name;
       
        }
       
        public int getAge()
        {
                return age;
       
        }
        //没搞明白为什么加一个这个就能把相同的挑出来呢?
        public int hashCode()
        {
                return 199;
       
        }
        public boolean equals(Object obj)
        {
                if(!(obj instanceof Person) )
                        return false;
                        Person p=(Person)obj;
                       
                        return this.name.equals(p.name)&& this.age==p.age;
                       
       
        }


}
class HashSetDemo
{       

        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",14));
                hs.add(new Person("a3",12));
                hs.add(new Person("a3",12));
                hs.add(new Person("a4",10));
               
                Iterator it=hs.iterator();
               
                while(it.hasNext())
                {
                        Person p=(Person)it.next();
                       
                        sop(p.getName()+"::"+p.getAge());
                       
                }
       
        }
       
}
这边为什么加了这个
public int hashCode()
        {
                return 199;
       
        }
他就能把重复的去掉呢?
没听明白。。。。。郁闷呢

评分

参与人数 1技术分 +1 收起 理由
轻语。 + 1

查看全部评分

6 个回复

倒序浏览
存入hashSet的对象,实际上不是存储的对象的哈希值。每次存入都会调用该对象hashcode方法,根据返回的哈希值进行分区,存储。如果哈希值形同,会再次调用equals进行判断,如果还是相同才会认为是同一个元素。
去掉重复的是:hahscode和equals共同决定的

评分

参与人数 1技术分 +1 收起 理由
轻语。 + 1

查看全部评分

回复 使用道具 举报
谭荣强 发表于 2014-6-12 22:30
存入hashSet的对象,实际上不是存储的对象的哈希值。每次存入都会调用该对象hashcode方法,根据返回的哈希 ...

也就是说,虽说hashcode方法写在person类里。主函数也没有明显调用,但是在吧对象存入哈希对象的时候就调用了hashcode这个方法?
看了你的好像略懂了。。。
回复 使用道具 举报
跟主函数没关系,是add()方法它会在调用hahscode方法和equals.每次添加之前要先检查。每个对象都有哈希值。你可以看看源码
回复 使用道具 举报
hashSet集合的底层数据结构是哈希表,所以,存入对象的时候会自动调用对象的hashCode方法获取其哈希值。
而且,hashSet集合保证元素唯一性的原理就是:当两个对象的哈希值不同的时候,就说明不是相同对象存入(不再调用equals方法);当哈希值相同,就再自动调用对象的equals方法判断是否是相同对象,相同的话则视为相同对象不予存入。

评分

参与人数 1技术分 +1 收起 理由
轻语。 + 1

查看全部评分

回复 使用道具 举报
上面的哥们讲得好,学习了
回复 使用道具 举报
-_-# 中级黑马 2014-6-13 21:02:21
7#
想飞的鱼 发表于 2014-6-12 23:39
hashSet集合的底层数据结构是哈希表,所以,存入对象的时候会自动调用对象的hashCode方法获取其哈希值。
而 ...

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