Java面試題 從源碼角度分析HashSet實現原理?

面試官:請問HashSet有哪些特色?java

應聘者:HashSet實現自set接口,set集合中元素無序且不能重複;面試

面試官:那麼HashSet 如何保證元素不重複?函數

應聘者:由於HashSet底層是基於HashMap實現的,當你new一個HashSet時候,其實是new了一個map,執行add方法時,實際上調用map的put方法,value始終是PRESENT,因此根據HashMap的一個特性: 將一個key-value對放入HashMap中時,首先根據key的hashCode()返回值決定該Entry的存儲位置,若是兩個key的hash值相同,那麼它們的存儲位置相同。若是這個兩個key的equalus比較返回true。那麼新添加的Entry的value會覆蓋原來的Entry的value,key不會覆蓋。所以,若是向HashSet中添加一個已經存在的元素,新添加的集合元素不會覆蓋原來已有的集合元素;源碼分析

 

源碼分析code

先來看一下無參的構造函數:blog

public HashSet() {
     map = new HashMap<>();
}

很顯然,當你new一個HashSet的時候,其實是new了一個HashMap接口

再來看一下add方法:源碼

private static final Object PRESENT = new Object();

public boolean add(E e) {
    return map.put(e, PRESENT)==null;
}

定義一個虛擬的Object PRESENT是向map中插入key-value對應的value,由於HashSet中只須要用到key,而HashMap是key-value鍵值對;因此,向map中添加鍵值對時,鍵值對的值固定是PRESENT。hash

源碼中HashSet的絕大部分方法都是經過調用HashMap的方法來實現的,其餘的方法,就請你們本身查閱一下源碼吧。class

相關文章
相關標籤/搜索