Java中常見數據結構Set之HashSet
阿新 • • 發佈:2017-09-10
顯示 clas src 項目開發 style created ide value 存儲 今天來說說Java集合中的Set系列之HashSet。
Set我們眾所周知的就是慮重功能, 我們平時在項目開發中也常用到這個特性的。那麽Set為何能夠慮重呢? 接下來我們就看下源碼吧。
Set的底層實現是HashMap(這個後面講Map時也會講它的源碼), 當我們在HashSet中添加一個新元素時, 其實這個值是存儲在底層Map的key中,而眾所周知,HashMap的key值是不能重復的, 所以這裏就可以達到去重的目的了。
直接看下HashSet的源碼:
下面說下HashSet需要註意的地方:
我們在項目中經常會對一些DTO進行慮重, 那麽我們必須要重寫equals和hashCode方法,具體可參見我的另一篇文章:重寫equals就必須重寫hashCode的原理分析
下面拿一個我在項目中DTO慮重的實例:
當我們new 一個HashSet實例時, 其實底層是新創建了一個HashMap實例。 放入HashSet中的集合元素實際上由HashMap的key來保存,而HashMap的value則存儲了一個PRESENT,它是一個靜態的Object對象。
/** * 新車上市相關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