這篇文章給大家介紹Java面試中如何從源碼角度分析HashSet實現原理,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
為企業(yè)提供成都做網站、網站建設、網站優(yōu)化、全網整合營銷推廣、競價托管、品牌運營等營銷獲客服務。創(chuàng)新互聯擁有網絡營銷運營團隊,以豐富的互聯網營銷經驗助力企業(yè)精準獲客,真正落地解決中小企業(yè)營銷獲客難題,做到“讓獲客更簡單”。自創(chuàng)立至今,成功用技術實力解決了企業(yè)“網站建設、網絡品牌塑造、網絡營銷”三大難題,同時降低了營銷成本,提高了有效客戶轉化率,獲得了眾多企業(yè)客戶的高度認可!面試官:請問HashSet有哪些特點?
應聘者:HashSet實現自set接口,set集合中元素無序且不能重復;
面試官:那么HashSet 如何保證元素不重復?
應聘者:因為HashSet底層是基于HashMap實現的,當你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中添加一個已經存在的元素,新添加的集合元素不會覆蓋原來已有的集合元素;
源碼分析
先來看一下無參的構造函數:
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的方法來實現的,其他的方法,就請大家自己查閱一下源碼吧。
關于Java面試中如何從源碼角度分析HashSet實現原理就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。