Set 怎麼保證不重複

2021-08-03 09:29:09 字數 1348 閱讀 2177

因為map中的key是不允許重複的,所以set中的元素不能重複。

hashmap的往裡放元素的原始碼!!!

public v put(k key, v value)  

} modcount++;

addentry(hash, key, value, i);

return

null;

}

分步驟判斷新增的key值:

1、取到新新增key值得hashcode值。

2、確定陣列的index 根據key的hashcode值和當前table的長度按位取並 h & (length-1);

按位取並,作用上相當於取模mod或者取餘%。

這意味著陣列下標相同,並不表示hashcode相同

3、這裡的hashcode在equals前面,jvm會先判斷或運算||的前部分,當這一前部分為true的時候判斷終止,返回true(這是為了提高jvm的效率),所以當hashcode不同的時候,equals是不會執行的。

總結為什麼set裡面不能有重複?

因為hashmap在put乙個key時會判斷,將要放進去的key的hash值與 目前hashmap中定位到的那個key的hash值比較。

如果hash值相當,繼續比較 這兩個物件的位址或者內容是否相當。

如果相當:判斷出來要新增的key與hashmap中的key重複,把value的值給替換成最新的。

hashset中的value是乙個固定值present。 所以修改不修改無所謂。

重寫equals方法後最好重寫hashcode方法,否則兩個等價物件可能得到不同的hashcode,這在集合框架中使用可能產生嚴重後果,這樣如果我們對乙個物件重寫了euqals,意思是只要物件的成員變數值都相等那麼euqals就等於true,但不重寫hashcode,那麼我們再new乙個新的物件,

當原物件.equals(新物件)等於true時,兩者的hashcode卻是不一樣的,由此將產生了理解的不一致,如在儲存雜湊集合時(如set類),將會儲存了兩個值一樣的物件,

導致混淆,因此,就也需要重寫hashcode()

注意:當此方法被重寫時,通常有必要重寫 hashcode 方法,以維護 hashcode 方法的常規協定,該協定宣告相等物件必須具有相等的雜湊碼。如下:

(1)當obj1.equals(obj2)為true時,obj1.hashcode() == obj2.hashcode()必須為true

(2)當obj1.hashcode() == obj2.hashcode()為false時,obj1.equals(obj2)必須為false

Set集合是如何保證元素不重複

在使用集合的時候,會經常用到set集合,set集合的特點如下 1,元素無序 2,元素不可重複 那麼set集合底層是如何保證元素無序的呢?1,在往set集合中新增物件的時候,首先會通過該物件的hashcode方法計算該物件的hash值。2,將計算出來的hash值去hash表中查詢,如果hash表中不存...

hashSet保證不重複的原理

總的來說,在向hashset中add 元素時,判斷元素是否存在的依據,不僅僅是hash碼值就能夠確定的,同時還要結合equles方法。hashset 類中的add 方法 public boolean add e e put 方法 public v put k key,v value modcount...

1245 不重複地輸出數(set)

輸入n個數,從小到大將它們輸出,重複的數隻輸出一次。保證不同的數不超過500個。第一行是乙個整數n。1 n 100000。之後n行,每行乙個整數。整數大小在int範圍內。一行,從小到大不重複地輸出這些數,相鄰兩個數之間用單個空格隔開。5 2 4 4 5 1 1 2 4 5 include inclu...