生活随笔
收集整理的這篇文章主要介紹了
Java HashSet的实现原理详解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
HashSet是Java Map類型的集合類中最常使用的,本文基于Java1.8,對于HashSet的實現原理做一下詳細講解。
(Java1.8源碼:http://docs.oracle.com/javase/8/docs/api/)
一、HashSet實現原理總結
HashSet的實現原理總結如下:
①是基于HashMap實現的,默認構造函數是構建一個初始容量為16,負載因子為0.75 的HashMap。封裝了一個 HashMap 對象來存儲所有的集合元素,所有放入 HashSet 中的集合元素實際上由 HashMap 的 key 來保存,而 HashMap 的 value 則存儲了一個 PRESENT,它是一個靜態的 Object 對象。
②當我們試圖把某個類的對象當成 HashMap的 key,或試圖將這個類的對象放入 HashSet 中保存時,重寫該類的equals(Object obj)方法和 hashCode() 方法很重要,而且這兩個方法的返回值必須保持一致:當該類的兩個的 hashCode() 返回值相同時,它們通過 equals() 方法比較也應該返回 true。通常來說,所有參與計算 hashCode() 返回值的關鍵屬性,都應該用于作為 equals() 比較的標準。
③HashSet的其他操作都是基于HashMap的。
二、HashSet的實現原理詳解
(轉自:http://zhangshixi.iteye.com/blog/673143)
1.??? HashSet概述:
???HashSet實現Set接口,由哈希表(實際上是一個HashMap實例)支持。它不保證set?的迭代順序;特別是它不保證該順序恒久不變。此類允許使用null元素。
?
2.??? HashSet的實現:
???對于HashSet而言,它是基于HashMap實現的,HashSet底層使用HashMap來保存所有元素,因此HashSet?的實現比較簡單,相關HashSet的操作,基本上都是直接調用底層HashMap的相關方法來完成,?HashSet的源代碼如下:
Java代碼??
public?class?HashSet<E>?? ????extends?AbstractSet<E>?? ????implements?Set<E>,?Cloneable,?java.io.Serializable?? {?? ????static?final?long?serialVersionUID?=?-5024744406713321676L;?? ?? ?????? ????private?transient?HashMap<E,Object>?map;?? ?????? ?????? ????private?static?final?Object?PRESENT?=?new?Object();?? ?? ????? ? ? ? ?? ????public?HashSet()?{?? ????map?=?new?HashMap<E,Object>();?? ????}?? ?? ????? ? ? ? ? ? ?? ????public?HashSet(Collection<??extends?E>?c)?{?? ????map?=?new?HashMap<E,Object>(Math.max((int)?(c.size()/.75f)?+?1,?16));?? ????addAll(c);?? ????}?? ?? ????? ? ? ? ? ? ?? ????public?HashSet(int?initialCapacity,?float?loadFactor)?{?? ????map?=?new?HashMap<E,Object>(initialCapacity,?loadFactor);?? ????}?? ?? ????? ? ? ? ? ?? ????public?HashSet(int?initialCapacity)?{?? ????map?=?new?HashMap<E,Object>(initialCapacity);?? ????}?? ?? ????? ? ? ? ? ? ? ? ?? ????HashSet(int?initialCapacity,?float?loadFactor,?boolean?dummy)?{?? ????map?=?new?LinkedHashMap<E,Object>(initialCapacity,?loadFactor);?? ????}?? ?? ????? ? ? ? ? ? ? ?? ????public?Iterator<E>?iterator()?{?? ????return?map.keySet().iterator();?? ????}?? ?? ????? ? ? ? ? ?? ????public?int?size()?{?? ????return?map.size();?? ????}?? ?? ????? ? ? ? ? ?? ????public?boolean?isEmpty()?{?? ????return?map.isEmpty();?? ????}?? ?? ????? ? ? ? ? ? ? ? ?? ????public?boolean?contains(Object?o)?{?? ????return?map.containsKey(o);?? ????}?? ?? ????? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ????public?boolean?add(E?e)?{?? ????return?map.put(e,?PRESENT)==null;?? ????}?? ?? ????? ? ? ? ? ? ? ? ? ?? ????public?boolean?remove(Object?o)?{?? ????return?map.remove(o)==PRESENT;?? ????}?? ?? ????? ? ? ? ?? ????public?void?clear()?{?? ????map.clear();?? ????}?? ?? ????? ? ? ? ?? ????public?Object?clone()?{?? ????????try?{?? ????????????HashSet<E>?newSet?=?(HashSet<E>)?super.clone();?? ????????????newSet.map?=?(HashMap<E,?Object>)?map.clone();?? ????????????return?newSet;?? ????????}?catch?(CloneNotSupportedException?e)?{?? ????????????throw?new?InternalError();?? ????????}?? ????}?? }??
?
參考文獻:http://alex09.iteye.com/blog/539549
總結
以上是生活随笔為你收集整理的Java HashSet的实现原理详解的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。