一、Object類的equals和hashCode方法::
public boolean equals(Object obj) {
return (this == obj);
}
public native int hashCode();
可以看到Object類的equals方法是判斷引用是否相等(和==的作用一樣),而不是比較對象中內部的值
二、String類的equals方法和hashCode方法:
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;
}
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value;
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}
可以看到,String類覆蓋了Object類中的equals和hashCode方法,
String類的equals方法:首先是比較對象的引用是否相等,然後再比較對象的值是否相等;
我們想知道判斷兩個對象是否相等(引用是否相等),用==就可以進行判斷(比較兩個對象的地址是否相等);
對於一個類:
如果我們想知道它的兩個對象內部的值是否相等,而不是判斷他們是否指向同一個對象,此時就要覆蓋equals方法,來判斷值是否相等;如果不覆蓋Object類的equals方法,那麼類的對象進行比較時,默認調用的是Object類的equals方法,判斷的是引用是否相等,而不是判斷對象內部的值是否相等;
三、hashCode方法
hashCode方法的作用是計算對象的hash碼(即散列值)
Object的hashCode方法默認是使用對象的地址計算hash碼
具有相同引用的對象具有相同的hash碼;
一般來說,在每個覆蓋了equals方法的類中,也必須覆蓋hashCode方法,特別是在和HashMap、LinkedList等集合一起使用時:
用hashCode來計算hash值,計算將該對象放在哪個桶的後面,然後用equals來判斷該對象是否與桶後面的鏈表中的某個對象相等,如果equals返回false,說明兩個對象的值不相等,則將覆蓋原來的對象,如果equals返回true,則不放入該對象;
如果兩個對象hash值相等,但是equals不一定相等;
如果兩個對象的equals相等,則hash值一定相等;