歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 高質量equals方法和HashCode

高質量equals方法和HashCode

日期:2017/3/1 9:12:04   编辑:Linux編程

equals方法

  1. 使用==操作符檢查“參數是否為當前對象的引用”,如果是,直接返回true;
  2. 使用instanceof 操作符檢查“參數是否為正確的類型”。如果不是,直接返回false。(根據具體邏輯,此處可能需要使用==判斷class);
  3. 將參數轉換為正確的類型;
  4. 對於該類中的每個“關鍵”域,檢查參數中的域是否與該對象中的魚相匹配。對於既不是float和double類型的基本類型域,使用==比較;對於對象引用域,使用equals方法;對於float域,使用Float.compare;對於double域,使用Double.compare
注意點:
  • 覆蓋equals時,總要覆蓋hashcode;
  • 不要將equals(Object obj) 中的Object參數類型替換為其他的類型。

hashCode方法的散列函數:
    1. 把某個非零的常數值,比如17,保存在一個名為result的int類型變量中;
    2. 對於對象中的每個關鍵域f(指equals方法中涉及的每個域),完成以下步驟:
      1. 為該域計算int類型的散列碼c:
        1. 如果該域是boolean類型,則計算(f?1:0);
        2. 如果該域是byte、short、char或者int類型,則計算(int)f;
        3. 如果該域是long類型,則計算(int)(f^(f>>>32));
        4. 如果該域是float類型,則計算Float.floatToIntBits(f);
        5. 如果該域是double類型,則計算Double.doubleToLongBits(f),然後按照步驟2.1.3,為得到的long類型計算散列值;
        6. 如果該域是一個對象引用,並且該類的equals方法通過遞歸的調用equals方式比較這個域,則通用為這個域遞歸的調用hashCode。
        7. 如果該域是一個數組,則要把每個元素當做單獨的域來處理。
      2. 按照下面的公式,把步驟2.1中計算得到的散列碼c合並到result中:
        result = 31*result + c;
    3. 返回result

Copyright © Linux教程網 All Rights Reserved