java集合__最常用的HashSet類判斷
阿新 • • 發佈:2018-12-11
HashSet 是Set 介面的典型實現,而Set集合大多數就是用的這個實現類
這個類的特定跟陣列相似,但是在某種的情況下比陣列更加的強大
有著這幾個特點:
-
沒有長度的要求,裡面的內容是無順序的。
-
裡面的值可以容許是null
-
HashSet 不是同步的,換句話說就是自己需要通過程式碼來保證其同步加鎖
重點的是:HashSet類的兩個方法,必須判斷的是同樣的結果
-
如果你要重寫一個equals()方法,你就應該重寫另一個方法hashCode()方法,
如果沒有判斷出相同的結果,,在這可以有個參考:
-
如果equals()方法是返回是true,但是HashSet()方法返回的是不同的false,則會造成HashSet類將兩個物件都儲存在不同的位置,這樣就與set集合的規則出現衝突
-
如果HashSet()方法返回的是true,但是equals()是false ,這樣的話,就會造成兩個物件的雜湊值是相同,這樣的結果就是在這個位置會出現鏈式結構來儲存的這兩個物件,會對查詢的本身有著影響,導致效能下降
下面給出重寫HashSet方法的步驟
- 把物件內每個有意義的例項變數(就是equals 方法判斷過的例項變數)計算出一個int 型別的hashCode值,計算方式如下
例項變數型別 | 計算方式 | 例項變數型別 | 計算方式 |
整數型別 (int ,short,char,byte) |
hashCode=(int)f | float | hashCode=Float.floatToIntBits(f) |
boolean | hashCode=(f?0:1) | double |
long1 =Double.doubleToLongBits(f) hashCode = (int)(1^(1>>>32)) |
long | hashCode=(int)(f ^ (f>>>32)) | 引用型別 | hashCode=f.hashCode() |
2. 用第一步計算出來的多個hashCode 值 組合計算出一個hashCode值返回,
return f1.hashCode() * 19+ (int)f2 * 31;
防止產生一樣的hash的值