1. 程式人生 > >Set存儲元素為啥是唯一的(以HashSet為例源碼分析)

Set存儲元素為啥是唯一的(以HashSet為例源碼分析)

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為例源碼分析)