1. 程式人生 > >java集合__最常用的HashSet類判斷

java集合__最常用的HashSet類判斷

HashSet 是Set 介面的典型實現,而Set集合大多數就是用的這個實現類

這個類的特定跟陣列相似,但是在某種的情況下比陣列更加的強大

     有著這幾個特點:

  1.  沒有長度的要求,裡面的內容是無順序的。

  2. 裡面的值可以容許是null

  3. HashSet 不是同步的,換句話說就是自己需要通過程式碼來保證其同步加鎖

重點的是:HashSet類的兩個方法,必須判斷的是同樣的結果

  • 如果你要重寫一個equals()方法,你就應該重寫另一個方法hashCode()方法,

  如果沒有判斷出相同的結果,,在這可以有個參考:

  1. 如果equals()方法是返回是true,但是HashSet()方法返回的是不同的false,則會造成HashSet類將兩個物件都儲存在不同的位置,這樣就與set集合的規則出現衝突

  2. 如果HashSet()方法返回的是true,但是equals()是false ,這樣的話,就會造成兩個物件的雜湊值是相同,這樣的結果就是在這個位置會出現鏈式結構來儲存的這兩個物件,會對查詢的本身有著影響,導致效能下降

下面給出重寫HashSet方法的步驟

  1.  把物件內每個有意義的例項變數(就是equals 方法判斷過的例項變數)計算出一個int 型別的hashCode值,計算方式如下
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的值