java源碼解析——equals方法

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 。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章