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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 孙铭泽 中级黑马   /  2012-8-20 22:13  /  3800 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public class Person {
        private String name;
        private int age;

        public Person() {
        }

        public Person(String name, int age) {
                this.name = name;
                this.age = age;
        }

        public String getName() {
                return name;
        }

        public void setName(String name) {
                this.name = name;
        }

        public int getAge() {
                return age;
        }

        public void setAge(int age) {
                this.age = age;
        }

        @Override
        public boolean equals(Object obj) {
                if (this == obj) {
                        return true;
                }

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

                Person p = (Person) obj;

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

public class HashSetDemo {

        public static void main(String[] args) {
                HashSet<Person> set = new HashSet<Person>();

                Person p1 = new Person("陈浩南",28);
                Person p2 = new Person("十三妹",23);
                Person p3 = new Person("陈小春",26);
                Person p4 = new Person("黄秋生",38);
                Person p5 = new Person("黄秋生",38);
                Person p6 = new Person("陈小春",26);
               

                set.add(p1);
                set.add(p2);
                set.add(p3);
                set.add(p4);
                set.add(p5);
                set.add(p6);

                Iterator<Person> it = set.iterator();
                while (it.hasNext()) {
                        Person p = it.next();
                        System.out.println(p.getName() + "***" + p.getAge());
                }
        }

}
我这样执行可是还是不能保证元素的唯一,为什么啊。

评分

参与人数 1技术分 +1 收起 理由
祁焱 + 1 淡定

查看全部评分

2 个回复

正序浏览
HashSet是通过元素的两个方法,hashCode和equals来保证元素唯一性的。
如果元素的HashCode值相同,才会判断equals是否为true。
如果元素的hashcode值不同,不会调用equals。
public class Person {
        private String name;
        private int age;
        public Person() {
        }
        public 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 void setName(String name) {
                this.name = name;
        }
        public int getAge() {
                return age;
        }
        public void setAge(int age) {
                this.age = age;
        }
只要在Person类中复写hashcode方法就OK了,这个很常用的
回复 使用道具 举报
你没有重写hashCode方法       
@Override
        public int hashCode() {
                return this.name.hashCode()+this.age*17;
        }

评分

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

查看全部评分

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