天天看點

說說equals() (上)

那麼,我們今天來說說equels,話不多說,上代碼:

/**
 * @author Shusheng Shi
 * @since 2017/8/19 11:20
 */
public class Person {
    private String name;

    public Person(String name) {
        this.name = name;
    }

     public static void main(String[] args) {
        String s1 = new String("100");
        String s2 = new String("100");
        System.out.println(s1.equals(s2));

        Integer integer = new Integer("123");
        Long lon = new Long("123");
        System.out.println(integer.equals(lon));

        Person person1 = new Person("張三");
        Person person2 = new Person("張三");
        System.out.println(person1.equals(person2));
    }
}
      

執行一下,結果如下:

true
false
false

Process finished with exit code 0      

在引用類型中:

  • “==”是比較兩個引用是否指向堆記憶體裡的同一個位址(同一個對象)
  • 而equals是一個普通的方法,該方法傳回的結果依賴于自身的實作。

我們先看一下Person這個類,并沒有equals方法呀,那為什麼不報錯呢?在Java中,如果一個類沒有繼承其它類,那麼它預設繼承Object這個類,打開Object這個類看一下,發現如下代碼,Person這個類的equals方法就繼承自這裡

public boolean equals(Object obj) {
        return (this == obj);
 }      

很簡單,就一句代碼,判斷兩個引用是否指向同一個對象,兩個Person對象在堆記憶體中的表現如下圖所示:

說說equals() (上)

是以代碼person1.equals(person2)等同于person1 == person2,當然列印出來的結果是false。我們再來看看Integer這個類, equals的實作如下:

public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
  }      

當代碼執行到System.out.println(itr.equals(lon))時,會判斷傳入的lon這個對象是否是Integer類型,這裡的lon是Long類型,是以列印出來的結果當然是false了。

最後是我們String的實作

public boolean equals(Object anObject) {
        //如果兩個對象指向同一個引用,直接傳回true
        if (this == anObject) {
            return true;
        }
        //1.判斷傳入的對象是否為String類型
        //2.判斷這兩個字元串底層cahr數組的長度是否一緻
        //3.循環判斷底層數組裡的每一個char字元,看值是否都相等
        //三個條件都滿足,傳回true,否則false
        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;
 }      

當代碼執行到:System.out.println(s3.equals(s4)),由于字元串底層char數組裡存的都是{‘1’,’0’,’0’}當然列印出來是true了。