HashSet的實現原理

2021-08-20 23:40:57 字數 1330 閱讀 1702

set的實現類的集合物件中不能夠有重複元素,hashset也一樣他是使用了一種標識來確定元素的不重複,hashset用一種演算法來保證hashset中的元素是不重複的,   hashset採用雜湊演算法,底層用陣列儲存資料。預設初始化容量16,載入因子0.75

object類中的hashcode()的方法是所有子類都會繼承這個方法,這個方法會用hash演算法算出乙個hash(雜湊)碼值返回,hashset會用hash碼值去和陣列長度取模, 模(這個模就是物件要存放在陣列中的位置)相同時才會判斷陣列中的元素和要加入的物件的內容是否相同,如果不同才會新增進去。

hash演算法是一種雜湊演算法。

set hs=new hashset();

hs.add(o);

|o.hashcode();

|o%當前總容量  (0--15)

|             

|                 不發生衝突

是否發生衝突-----------------直接存放

|| 發生衝突

|                  假(不相等)

o1.equals(o2)-------------------找乙個空位新增

||  是(相等)

不新增覆蓋hashcode()方法的原則:

1、一定要讓那些我們認為相同的物件返回相同的hashcode值

2、盡量讓那些我們認為不同的物件返回不同的hashcode值,否則,就會增加衝突的概率。

3、盡量的讓hashcode值雜湊開(兩值用異或運算可使結果的範圍更廣)

hashset 的實現比較簡單,相關hashset的操作,基本上都是直接呼叫底層hashmap的相關方法來完成,我們應該為儲存到hashset中的物件覆蓋hashcode()和equals(),因為再將物件加入到hashset中時,會首先呼叫hashcode方法計算出物件的hash值,接著根據此hash值呼叫hashmap中的hash方法,得到的值& (length-1)得到該物件在hashmap的transient entry table中的儲存位置的索引,接著找到陣列中該索引位置儲存的物件,並呼叫equals方法比較這兩個物件是否相等,如果相等則不新增,注意:所以要存入hashset的集合物件中的自定義類必須覆蓋hashcode(),equals()兩個方法,才能保證集合中元素不重複。在覆蓋equals()和hashcode()方法時, 要使相同物件的hashcode()方法返回相同值,覆蓋equals()方法再判斷其內容。為了保證效率,所以在覆蓋hashcode()方法時, 也要盡量使不同物件盡量返回不同的hash碼值。

如果陣列中的元素和要加入的物件的hashcode()返回了相同的hash值(相同物件),才會用equals()方法來判斷兩個物件的內容是否相同。

HashSet的實現原理

hashset實現set介面,由雜湊表 實際上是乙個hashmap例項 支援。它不保證set 的迭代順序 特別是它不保證該順序恆久不變。此類允許使用null元素。hashset中不允許有重複元素,這是因為hashset是基於hashmap實現的,hashset中的元素都存放在hashmap的key上...

HashSet的實現原理

hashset實際上是乙個hashmap例項,都是乙個存放鍊錶的陣列。它不保證儲存元素的迭代順序 此類允許使用null元素。hashset中不允許有重複元素,這是因為hashset是基於hashmap實現的,hashset中的元素都存放在hashmap的key上面,而value中的值都是統一的乙個固...

HashSet的實現原理,簡單易懂

hashset實際上是乙個hashmap例項,都是乙個存放鍊錶的陣列。它不保證儲存元素的迭代順序 此類允許使用null元素。hashset中不允許有重複元素,這是因為hashset是基於hashmap實現的,hashset中的元素都存放在hashmap的key上面,而value中的值都是統一的乙個固...