HashSet原始碼分析總結

2021-08-19 01:28:50 字數 4224 閱讀 2585

hashset實現set介面,由雜湊表(實際上是乙個hashmap例項)支援。它不保證set 的迭代順序;特別是它不保證該順序恆久不變。此類允許使用null元素。hashset中的元素實際上取得是hashmap節點中的key,因為hashmap中的key具有唯一性,故而hashset中的元素值不可重複;由於hashmap中節點的key可以為null,所以hashset允許使用null元素,這下是不是覺得hashset實現太簡單了,說白了它就是完全依賴hashmap的乙個資料結構。

對於hashset而言,它是基於hashmap實現的,hashset底層使用hashmap來儲存所有元素,因此hashset 的實現比較簡單,相關hashset的操作,基本上都是直接呼叫底層hashmap的相關方法來完成, hashset繼承abstractset類,實現 set, cloneable,serializable介面。

// 底層使用hashmap來儲存hashset中所有元素。  

private transient hashmapmap;   

// 定義乙個虛擬的object物件作為hashmap的value,將此物件定義為static final。  這個value沒啥鳥用

private static final object present = new object();  

/** 

* 預設的無參構造器,構造乙個空的hashset。 

*  * 實際底層會初始化乙個空的hashmap,並使用預設初始容量為16和載入因子0.75。 

*/  

public hashset()  

/** 

* 構造乙個包含指定collection中的元素的新set。 

* * 實際底層使用預設的載入因子0.75和足以包含指定 

* collection中所有元素的初始容量來建立乙個hashmap。 

* @param c 其中的元素將存放在此set中的collection。 

*/  

public hashset(collection<? extends e> c)   

//abstractcollection中的方法,add方法實際呼叫的是hashset中的add方法,也就是hashmap的put方法,把元素放到hashmap中

public boolean addall(collection<? extends e> c)

/** 

* 以指定的initialcapacity和loadfactor構造乙個空的hashset。 

* * 實際底層以相應的引數構造乙個空的hashmap。 

* @param initialcapacity 初始容量。 

* @param loadfactor 載入因子。 

*/  

public hashset(int initialcapacity, float loadfactor)   

/** 

* 以指定的initialcapacity構造乙個空的hashset。 

* * 實際底層以相應的引數及載入因子loadfactor為0.75構造乙個空的hashmap。 

* @param initialcapacity 初始容量。 

*/  

public hashset(int initialcapacity)   

/** 

* 以指定的initialcapacity和loadfactor構造乙個新的空鏈結雜湊集合。 

* 此建構函式為包訪問許可權,不對外公開,實際只是是對linkedhashset的支援。 

* 也就是說我們也可以例項化乙個輸出順序和新增順序一直的hashset

* * 實際底層會以指定的引數構造乙個空linkedhashmap例項來實現。 

* @param initialcapacity 初始容量。 

* @param loadfactor 載入因子。 

* @param dummy 標記。 

*/  

hashset(int initialcapacity, float loadfactor, boolean dummy)   

/** 

* 返回對此set中元素進行迭代的迭代器。返回元素的順序並不是特定的。 

*  * 底層實際呼叫底層hashmap的keyset來返回所有的key。 

* 可見hashset中的元素,只是存放在了底層hashmap的key上, 

* value使用乙個static final的object物件標識。 

* @return 對此set中元素進行迭代的iterator。 

*/  

public iteratoriterator()   

/** 

* 返回此set中的元素的數量(set的容量)。 

* * 底層實際呼叫hashmap的size()方法返回entry的數量,就得到該set中元素的個數。 

* @return 此set中的元素的數量(set的容量)。 

*/  

public int size()   

/** 

* 如果此set包含指定元素,則返回true。 

* 更確切地講,當且僅當此set包含乙個滿足(o==null ? e==null : o.equals(e)) 

* 的e元素時,返回true。 

* * 底層實際呼叫hashmap的containskey判斷是否包含指定key。 

* @param o 在此set中的存在已得到測試的元素。 

* @return 如果此set包含指定元素,則返回true。 

*/  

public boolean contains(object o)   

/** 

* 如果指定元素存在於此set中,則將其移除。 

* 更確切地講,如果此set包含乙個滿足(o==null ? e==null : o.equals(e))的元素e, 

* 則將其移除。如果此set已包含該元素,則返回true 

* (或者:如果此set因呼叫而發生更改,則返回true)。(一旦呼叫返回,則此set不再包含該元素)。 

* * 底層實際呼叫hashmap的remove方法刪除指定entry。 

* @param o 如果存在於此set中則需要將其移除的物件。 

* @return 如果set包含指定元素,則返回true。 

*/  

public boolean remove(object o)   

/** 

* 從此set中移除所有元素。此呼叫返回後,該set將為空。 

* * 底層實際呼叫hashmap的clear方法清空entry中所有元素。 

*/  

public void clear()   

/** 

* 返回此hashset例項的淺表副本:並沒有複製這些元素本身。 

* * 底層實際呼叫hashmap的clone()方法,獲取hashmap的淺表副本,並設定到  hashset中。 

*/  

public object clone() catch (clonenotsupportedexception e)   

}  /** 

* 如果此set中尚未包含指定元素,則新增指定元素。 

* 更確切地講,如果此 set 沒有包含滿足(e==null ? e2==null : e.equals(e2)) 

* 的元素e2,則向此set 新增指定的元素e。 

* 如果此set已包含該元素,則該呼叫不更改set並返回false。 

* * 底層實際將將該元素作為key放入hashmap。 

* 由於hashmap的put()方法新增key-value對時,當新放入hashmap的entry中key 

* 與集合中原有entry的key相同(hashcode()返回值相等,通過equals比較也返回true), 

* 新新增的entry的value會將覆蓋原來entry的value,但key不會有任何改變, 

* 因此如果向hashset中新增乙個已經存在的元素時,新新增的集合元素將不會被放入hashmap中, 

* 原來的元素也不會有任何改變,這也就滿足了set中元素不重複的特性。 

* @param e 將新增到此set中的元素。 

* @return 如果此set尚未包含指定元素,則返回true。 

*/  

public boolean add(e e)  

hashset沒必要仔細學習,好好把hashmap原始碼學習了,hashset自然就會了。

HashSet原始碼分析

基於hashmap的set介面實現。它不保證集合的迭代順序。特別是,它不能保證順序會隨著時間的推移保持恆定,當擴容時順序將調整。此類允許null元素。建立的hashmap private transient hashmap map 因為底層使用hashmap實現,要存key,value,這個固定值就...

Java原始碼分析之HashSet

hashset的本質,其實就是hashmap private transient hashmapmap hashmap是鍵值對,而hashset是單值,所以需要乙個值來充當鍵值對中的值 private static final object present new object public has...

集合原始碼分析(四)HashSet集合

無序 無索引 不可以重複。a 存入集合的順序和取出集合的順序不一致 b 沒有索引 c 存入集合的元素不能重複 使用hashset集合注意點 重寫hashcode和equals方法。呼叫順序 規則 新新增到hashset集合的元素都會與集合中已有的元素一一比較。首先比較雜湊值 每個元素都會呼叫hash...