1. 程式人生 > >Java中常見數據結構Set之HashSet

Java中常見數據結構Set之HashSet

顯示 clas src 項目開發 style created ide value 存儲

今天來說說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方法。

Java中常見數據結構Set之HashSet