用HashSet存储不重复的对象

直接进入主题,先来创建一个类:Bean

public class Bean {
    private int id;
    private String name;
    public Bean() {
        super();
    }
    public Bean(int id, String name) {
        super();
        this.id = id;
        this.name = name;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    
    @Override
    public boolean equals(Object obj) {
        if(!(obj instanceof Bean)) {
            return false;
        }
        Bean b = (Bean)obj;
        if(this.id == b.id) {
            return true;
        }
        return false;
    }
    
    @Override
    public int hashCode() {
        return id;
    }
}

可以看出类Bean与普通的JavaBean相比,多了2个方法,即重写了Object类的equals和hashCode方法,这里让Bean的实例,只要是id相同就认为是相同的实例,当然也可以是其他,这就要看具体需求,但必须保证当2个对象的hashCode方法的返回值相同时,它们的equals方法也的返回值要是true,这样才能保证不重复。下面来测试一下:

public class HashSetTest {

    @Test
    public void test01() {
        Set<Bean> set = new HashSet<>();
        Bean b1 = new Bean(1,"123");
        Bean b2 = new Bean(2,"456");
        set.add(b1);
        set.add(b2);
        Bean b3 = new Bean(1,"789");
        Bean b4 = new Bean(2,"012");
        set.add(b3);
        set.add(b4);
        System.out.println(set.size());
    }
}

运行结果是:2

并且变量set中存放的是对象吧b1和b2,因为在添加对象b3和b4时,首先会调用hashCode方法,若返回的数,集和中已经存在hashCode相同的对象,那么对调用equals方法,若equals方法返回true,则放弃添加,返回false,反之。

注意必须重写Object类的方法,即形参是Object类型,而不能添加类似下面的equals方法:

public boolean equals(Bean b) {
    if(this.id == b.id) {
        return true;
    }
    return false;
}

若是这种写法,打断点是进不去的,也就是说当hashCode相同时,不会调用该方法,而是调用Object的equals方法。

就这些了。。。

posted @ 2017-02-28 21:04  sprinkle  阅读(6053)  评论(0编辑  收藏  举报