hashset去重原理解析____如何去重一個List中的相同元素

HashSet加入的對象需要重寫hashCode方法和equals方法,因爲對於自定義類需要提供判斷怎樣纔算重複元素的方法。

本例中的hashCode方法和equals方法即是用來判斷student對象是否爲重複對象的標準方法。

個人理解就是 hashset內部會把集合中每個元素都回去依次計算hashcode放到一個地方存儲

依次向下計算,如果發現hashcode值在該存儲中已存在,則去調用equals方法

去判斷是否爲相同屬性的對象,若是則返回true,如果不是則返回false 

如果屬性值相同則返回true,不同則返回false,如果equals方法返回的是true則hashset則會對該數據進行去重,不會添加該數據到集合中,如果返回的是false,則hashset不會進行去重操作,會添加該數據到集合中

測試代碼用例如下
@PrepareForTest({ ZcxFactory.class, ArteryNormalCodeUtil.class })
public class SjrhServiceTest {

   @Test
    void testlistUNION() {
        Code code1 = new Code("1", "2", "3");    Code code2 = new Code("1", "2", "3");
        Code code3 = new Code("1", "2", "3");    Code code4 = new Code("1", "2", "4");
        List<Code> aa = new ArrayList<>();
        aa.add(code1);
        aa.add(code2);
        aa.add(code3);
        HashSet<Code> bb = new HashSet<>();
        //bb.addAll(aa);
        bb.add(code1); 第一次會  去調hashcode,但不會去調equals方法 
        bb.add(code2);這裏還是先去調hashcode計算,該值存在,所以回去調equals方法來判斷          是否爲屬性相同的對象
        bb.add(code3);這裏還是先去調hashcode計算,該值存在,所以回去調equals方法來判斷          是否爲屬性相同的對象

        bb.add(code4); 這裏還是先去調用hashcode計算,該值不存在 所以不會去調用equals            方法來進行判斷

        List<Code> cc = new ArrayList<>();
        cc.addAll(bb);
        for (Code code : cc) {
            System.out.println(code);
        }

    }

}
 

實體類:
public class Code {
    private String NBh;

    private String NDm;

    public Code(String nBh, String nDm, String cMc) {
        super();
        NBh = nBh;
        NDm = nDm;
        CMc = cMc;
    }

    private String CMc;

    
    /**
     * 
     */
    public Code() {
        super();
    }

    /**
     * @return the nBh
     */
    public String getNBh() {
        return NBh;
    }

    /**
     * @param nBh
     *            the nBh to set
     */
    public void setNBh(String nBh) {
        NBh = nBh;
    }

    /**
     * @return the nDm
     */
    public String getNDm() {
        return NDm;
    }

    /**
     * @param nDm
     *            the nDm to set
     */
    public void setNDm(String nDm) {
        NDm = nDm;
    }

    /**
     * @return the cMc
     */
    public String getCMc() {
        return CMc;
    }

    /**
     * @param cMc
     *            the cMc to set
     */
    public void setCMc(String cMc) {
        CMc = cMc;
    }
    @Override
    public int hashCode() {
         int result = CMc.hashCode()+ NBh.hashCode()+NDm.hashCode();
              
        return result;
    }

    @Override
    public boolean equals(Object obj) {
    
        Code cs = (Code) obj;
        if (!CMc.equals(cs.CMc)) {
            return false;
        }
        if (!NBh.equals(cs.NBh)) {
            return false;
        }
        return NDm.equals(cs.NDm);
    }

    @Override
    public String toString() {
        return "Code [NBh=" + NBh + ", NDm=" + NDm + ", CMc=" + CMc + "]";
    }

}
 

}
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章