equals:
- 判斷this對象與anObject對象是否相等(
this == anObject
) - 判斷anObject對象是否爲類或其子類對象(
anObject instanceof String
) - 比較類中屬性是否相等
基本類型,直接使用==判斷
集合數組類型,遍歷集合數組使用相應equals方法判斷
引用數據類型,使用相應equals方法判斷 - 重寫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:
- 定義int類型變量hashCode並賦值1(
int hashCode = 1;
) - 對於每個成員變量,進行如下計算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())
- 對每個字段進行如下操作:
hashCode = 31 * hashCode + c;
- 返回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;
}