String對象的equals方法的源代碼:
public boolean equals(Object anObject) {
//anObject爲被比較的對象,
//第一步:先判斷比較對象與被比較對象地址是否一致,若地址一致則返回true
if (this == anObject) {
return true;
}
//第二步:若地址不一致繼續判斷被比較對象類型是否爲String類型,若是則判斷內容是否一致,一致返回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;
}
}
//第二步類型不一致則直接返回false
return false;
}
Integer對象的equals方法源碼:
public boolean equals(Object obj) {
//判斷被比較對象的類型是否爲Integer
if (obj instanceof Integer) {
//對象類型一致則返回兩對象的值是否相等
return value == ((Integer)obj).intValue();
}
//否則返回false
return false;
}
測試:
package src.main;
public class Test {
public static void main(String []args)
{
String test1="zhao";
String test2="zhao";
System.out.println("test1==test2輸出:"+(test1==test2));
System.out.println("test1.equals(test2)輸出:"+test1.equals(test2));
Integer test3=new Integer(10);
Integer test4=new Integer(10);
System.out.println("test3==test4輸出:"+(test3==test4));
System.out.println("test3.equals(test4)輸出:" + test3.equals(test4));
// 輸出結果:
// test1==test2輸出:true //說明test1和test2的內存地址相同
// test1.equals(test2)輸出:true //說明test1和test2的值相同
// test3==test4輸出:false //說明test3和test4的內存地址不同
// test3.equals(test4)輸出:true //說明test3和test4的值相同
}
}
其他自定義對象如果需要可按需求重寫equals方法
拓展:
關於此處源碼中instanceof關鍵字的使用:
instanceof 嚴格來說是Java中的一個雙目運算符,用來測試一個對象是否爲一個類的實例,用法爲:
boolean result = obj instanceof Class
注意:編譯器會檢查 obj 是否能轉換成右邊的class類型,如果不能轉換則直接報錯,如果不能確定類型,則通過編譯,具體看運行時定。
其中 obj 爲一個對象,Class 表示一個類或者一個接口,當 obj 爲 Class 的對象,或者是其直接或間接子類,或者是其接口的實現類,結果result 都返回 true,否則返回false。obj必須爲引用類型,基本數據類型編譯不通過,如果 obj 爲 null,那麼將返回 false。
用僞代碼進行描述:
boolean result;
if (obj == null) {
result = false;
} else {
try {
T temp = (T) obj; // checkcast
result = true;
} catch (ClassCastException e) {
result = false;
}
}
也就是說有表達式 obj instanceof T,instanceof 運算符的 obj 操作數的類型必須是引用類型或空類型; 否則,會發生編譯時錯誤。如果 obj 強制轉換爲 T 時發生編譯錯誤,則關係表達式的 instanceof 同樣會產生編譯時錯誤。 在這種情況下,表達式實例的結果永遠爲false。在運行時,如果 T 的值不爲null,並且 obj 可以轉換爲 T 而不引發ClassCastException,則instanceof運算符的結果爲true。 否則結果是錯誤的
簡單來說就是:如果 obj 不爲 null 並且 (T) obj 不拋 ClassCastException 異常則該表達式值爲 true ,否則值爲 false 。