Java中常見數據結構Set之HashSet


今天來說說Java集合中的Set系列之HashSet。
 
Set我們眾所周知的就是慮重功能, 我們平時在項目開發中也常用到這個特性的。那么Set為何能夠慮重呢? 接下來我們就看下源碼吧。
 
Set的底層實現是HashMap(這個后面講Map時也會講它的源碼), 當我們在HashSet中添加一個新元素時, 其實這個值是存儲在底層Map的key中,而眾所周知,HashMap的key值是不能重復的, 所以這里就可以達到去重的目的了。
 
直接看下HashSet的源碼:

 

 
當我們new 一個HashSet實例時, 其實底層是新創建了一個HashMap實例。 放入HashSet中的集合元素實際上由HashMap的key來保存,而HashMap的value則存儲了一個PRESENT,它是一個靜態的Object對象。
 
下面說下HashSet需要注意的地方:
我們在項目中經常會對一些DTO進行慮重, 那么我們必須要重寫equals和hashCode方法,具體可參見我的另一篇文章: 重寫equals就必須重寫hashCode的原理分析
 
下面拿一個我在項目中DTO慮重的實例:
/**
 * 新車上市相關DTO
 * Created by WangMeng on 2017/8/9.
 */
public class NewListedCarDTO {
    /**
     * id
     */
    private long id;
    /**
     * 車系id
     */
    private long seriesId;
    /**
     * 頭條文章id
     */
    private long teleId;
    /**
     * 車系顯示名稱
     */
    private String seriesTitle;
    /**
     * 車系標簽
     */
    private String seriesTag;
    /**
     * 上市時間
     */
    private String listTime;

    /**
     * 上市狀態
     * 0:不可用 1:即將上市 2:已經上市
     */
    private int articleType;

    private int listYear;

    private int listMonth;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof NewListedCarDTO)) return false;

        NewListedCarDTO that = (NewListedCarDTO) o;

        if (seriesId != that.seriesId) return false;
        if (listYear != that.listYear) return false;
        return listMonth == that.listMonth;
    }

    @Override
    public int hashCode() {
        int result = (int) (seriesId ^ (seriesId >>> 32));
        result = 31 * result + listYear;
        result = 31 * result + listMonth;
        return result;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public long getSeriesId() {
        return seriesId;
    }

    public void setSeriesId(long seriesId) {
        this.seriesId = seriesId;
    }

    public long getTeleId() {
        return teleId;
    }

    public void setTeleId(long teleId) {
        this.teleId = teleId;
    }

    public String getSeriesTitle() {
        return seriesTitle;
    }

    public void setSeriesTitle(String seriesTitle) {
        this.seriesTitle = seriesTitle;
    }

    public String getSeriesTag() {
        return seriesTag;
    }

    public void setSeriesTag(String seriesTag) {
        this.seriesTag = seriesTag;
    }

    public String getListTime() {
        return listTime;
    }

    public void setListTime(String listTime) {
        this.listTime = listTime;
    }

    public int getArticleType() {
        return articleType;
    }

    public void setArticleType(int articleType) {
        this.articleType = articleType;
    }

    public int getListYear() {
        return listYear;
    }

    public void setListYear(int listYear) {
        this.listYear = listYear;
    }

    public int getListMonth() {
        return listMonth;
    }

    public void setListMonth(int listMonth) {
        this.listMonth = listMonth;
    }
}

 這里要根據seriesId和listMonth這兩個字段去重, 所以必須重寫equals和hashCode方法。


免責聲明!

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



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