Effective-Java(Item 9)之重寫equals時總要重寫hashCode

equals:

  1. 判斷this對象與anObject對象是否相等(this == anObject
  2. 判斷anObject對象是否爲類或其子類對象(anObject instanceof String
  3. 比較類中屬性是否相等
      基本類型,直接使用==判斷
      集合數組類型,遍歷集合數組使用相應equals方法判斷
      引用數據類型,使用相應equals方法判斷
  4. 重寫equals方法是總要重寫hashCode方法(Always override hashCode when you override equals)

如String類的equals方法:

// java.lang.String#equals
public boolean equals(Object anObject) {
	  if (this == anObject) {
	       return true;
	   }
	   if (anObject instanceof String) {
	       String anotherString = (String)anObject;
	       int n = value.length;
	       if (n == anotherString.value.length) {
	           char v1[] = value;
	           char v2[] = anotherString.value;
	           int i = 0;
	           while (n-- != 0) {
	               if (v1[i] != v2[i])
	                   return false;
	               i++;
	           }
	           return true;
	       }
	   }
	   return false;
}


hashCode:

  1. 定義int類型變量hashCode並賦值1(int hashCode = 1;
  2. 對於每個成員變量,進行如下計算hash code c(根據字段類型):
    boolean:  (f ? 1 : 0)
    byte, char, short, int: (int) f
    long: (int) (f ^ (f >>> 32))
    float: Float.floatToIntBits(f)
    double: Double.doubleToLongBits(f)
    Object: (obj==null ? 0 : obj.hashCode())
  3. 對每個字段進行如下操作: hashCode = 31 * hashCode + c;
  4. 返回hashCode(return hashCode;)
//java.util.AbstractList#hashCode
public int hashCode() {
    int hashCode = 1;
    for (E e : this)
        hashCode = 31*hashCode + (e==null ? 0 : e.hashCode());
    return hashCode;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章