Java面試題 從源碼角度分析HashSet實現(xiàn)原理
面試官:請問HashSet有哪些特點?
應聘者:HashSet實現(xiàn)自set接口,set集合中元素無序且不能重復;
面試官:那么HashSet 如何保證元素不重復?
應聘者:因為HashSet底層是基于HashMap實現(xiàn)的,當你new一個HashSet時候,實際上是new了一個map,執(zhí)行add方法時,實際上調用map的put方法,value始終是PRESENT,所以根據HashMap的一個特性: 將一個key-value對放入HashMap中時,首先根據key的hashCode()返回值決定該Entry的存儲位置,如果兩個key的hash值相同,那么它們的存儲位置相同。
如果這個兩個key的equalus比較返回true。那么新添加的Entry的value會覆蓋原來的Entry的value,key不會覆蓋。因此,如果向HashSet中添加一個已經存在的元素,新添加的集合元素不會覆蓋原來已有的集合元素;
源碼分析
先來看一下無參的構造函數(shù):
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的方法來實現(xiàn)的,其他的方法,就請大家自己查閱一下源碼吧。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
SpringBoot+阿里云OSS實現(xiàn)在線視頻播放的示例
這篇文章主要介紹了SpringBoot+阿里云OSS實現(xiàn)在線視頻播放的示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-11-11
Java中數(shù)組和String相互轉換的幾種常見方法
這篇文章主要介紹了Java中數(shù)組和String相互轉換的幾種常見方法,每種類型都有相應的轉換方法,如使用String類的構造函數(shù)、toCharArray()、String.join()、Arrays.toString()、StringBuilder等,這些方法能幫助開發(fā)者高效地進行數(shù)據類型之間的轉換,需要的朋友可以參考下2025-04-04
一文搞清楚Java中Comparable和Comparator的區(qū)別
Java中的Comparable和Comparator都是用于集合排序的接口,但它們有明顯的區(qū)別,文中通過一些實例代碼詳細介紹了Java中Comparable和Comparator的區(qū)別,感興趣的同學跟著小編一起學習吧2023-05-05
SpringBoot基于redis自定義注解實現(xiàn)后端接口防重復提交校驗
本文主要介紹了SpringBoot基于redis自定義注解實現(xiàn)后端接口防重復提交校驗,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-01-01
Springboot pom項目間接依賴包版本與預期不符原因解決分析
這篇文章主要介紹了Springboot pom項目間接依賴包版本與預期不符原因解決分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08

