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

Java螞蟻發表於2019-07-25

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

應聘者: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中新增一個已經存在的元素,新新增的集合元素不會覆蓋原來已有的集合元素;

 

原始碼分析

先來看一下無參的建構函式:

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。

原始碼中HashSet的絕大部分方法都是通過呼叫HashMap的方法來實現的,其他的方法,就請大家自己查閱一下原始碼吧。

 

相關文章