Core Java 簡單談談HashSet
阿新 • • 發佈:2017-09-18
code col targe leave fin all 重復 struct truct
同學們在看這個問題的時候,我先提出者兩個問題,然後大家帶著問題看這個文章會理解的更好。
- HashSet為什麽添加元素時不能添加重復元素?
- HashSet是否添加null元素?
打開源碼, 我們看到如下代碼,我們看到HashSet也有一個HashMap做為屬性,HashSet()的構造方法就是將這個map實例化。如果大家對HashMap還不了解話,可以看我的這篇博文。還要註意有一個靜態final的對象PRESENT,這個是幹什麽用的,咱們繼續往下看。
private transient HashMap<E,Object> map; // Dummy value to associate with an Object in the backing Mapprivate static final Object PRESENT = new Object(); /** * Constructs a new, empty set; the backing <tt>HashMap</tt> instance has * default initial capacity (16) and load factor (0.75). */ public HashSet() { map = new HashMap<>(); }
然後我們再打開其add方法,其就是將元素e放到HashMap中,然後將靜態final對象PRESENT作為value放到裏邊,如果添加成功,那麽HashMap返回null,然後也就是添加成功了,上一篇博文也講到了,咱們再講一次作為復習。如果將element放到HashMap裏邊,首先判斷其hashCode,如果hashCode沒有找到,就根據hashCode計算index放到對應的bucket中,如果hashCode相同的話,那麽再根據key的是否equals作為第二判斷,放到相應的linked list裏邊了。
/** * Adds the specified element to this set if it is not already present. * More formally, adds the specified element <tt>e</tt> to this set if * this set contains no element <tt>e2</tt> such that * <tt>(e==null ? e2==null : e.equals(e2))</tt>. * If this set already contains the element, the call leaves the set * unchanged and returns <tt>false</tt>. * *@param e element to be added to this set * @return <tt>true</tt> if this set did not already contain the specified * element */ public boolean add(E e) { return map.put(e, PRESENT)==null;
當然第二個問題同學們是否也想到了,因為hashMap是支持key為null的,所以HashSet也是可以添加key為null的元素的。HashMap用的地方這麽多,大家知道它很重要了吧?!
Core Java 簡單談談HashSet