Set存儲元素為啥是唯一的(以HashSet為例源碼分析)
阿新 • • 發佈:2019-03-04
final htm iat boolean targe ati 1.8 分享 hashmap
本文版權歸 遠方的風lyh和博客園共有,歡迎轉載,但須保留此段聲明,並給出原文鏈接,謝謝合作,如有錯誤之處忘不吝批評指正!
說些廢話
以前面試的時候會遇到有人問Set 和list的區別 這個很好說,但前幾天有同事面試分享了面試過程 問到了 Set和List區別了,同事回答了!緊接著 面試官問Set問啥可以保證存儲的值不會重復,他說他的表情瞬間凝固了,逗樂了我!其實我也不是很清楚,決定研究一下源碼,以下源碼基於jdk1.8
源碼分析
變量定義
// HashSet存儲數據是放在HashMap中的 private transient HashMap<E,Object> map;//Dummy value to associate with an Object in the backing Map private static final Object PRESENT = new Object();
add方法
/*** ** 可以看到添加元素時會把值當做 HashMap的 key存進去 看到這裏應該明白了吧! ** HashMap的key是唯一的 ***/ public boolean add(E e) { return map.put(e, PRESENT)==null; }
總結
HashSet存儲元素不會重復通過源碼分析: HashSet的內部存儲結構 是HashMap,存儲元素時 元素會作為HashMap的key值存入,HashMap的key是不會重復的!
Set存儲元素為啥是唯一的(以HashSet為例源碼分析)