用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方法。

就這些了。。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2024 CODEPRJ.COM