天天看點

== 和 equals 的差別是什麼?面試篇(第二天)

初級回答:

== 判斷的是位址是否相同,equals判斷的是值是否相同。

中級回答:

== 在基本類型中, == 比較的是值是否相同,例如:int a = 1; int b = 2; a==b比較的是1和2的值。

== 在引用類型中(引用類型是類類型、接口類型、數組類型), == 比較的是位址是否相同,例如String c = new String(“李四”); 和 String d = new String(“李四”); 他們的比較c == d比較的是c和d的位址引用是否相同,這裡很明顯c和d的位址引用是不相同的,因為是兩個不同的對象。

進階回答

首先來看equals的源碼,源碼中的注釋是我添加的,我覺得通過注釋就可以很簡單的明白equals方法中的邏輯了吧,背景圖檔是我idea的背景圖,有想要的可以私信我,嘿嘿。。。

== 和 equals 的差別是什麼?面試篇(第二天)
public boolean equals(Object anObject) {
        //判斷位址是否相同,如果位址相同則直接傳回true,如果位址不相同再去判斷值是否相同
        if (this == anObject) {
            return true;
        }
        //首先判斷傳進來的類是否是String類的子類,不懂instanceof函數可以百度
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            //判斷兩個資料長度是否相同,如果長度相同則判斷每一位字元是否相同,長度不同則直接傳回false
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    //判斷每一位字元是否相同,如果有一位字元不相同則傳回false
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }      

通過源碼可以看到equals方法中首先判斷的是位址是否相同,如果位址相同則直接傳回為true,如果位址不相同則再判斷值是否相同。這裡首先說明一下這段equals源碼是在String類中的,如下圖。

== 和 equals 的差別是什麼?面試篇(第二天)

就是說隻有String類型的使用equals方法才能先比較位址是否相同,如果位址不同則再比較值是否相同,那麼equals在對象類型或者數組類型中有沒有這種比較邏輯呢,我們看圖。

== 和 equals 的差別是什麼?面試篇(第二天)
class Student {
            public Student(String name) {
                this.name = name;
            }

            private String name;

            public String getName() {
                return name;
            }

            public void setName(String name) {
                this.name = name;
            }
        }

        Student s1 = new Student("張三");
        Student s2 = new Student("張三");
        System.out.println(s1.equals(s2)); // false


        char [] q = {1,2,3};
        char [] w = {1,2,3};
        System.out.println(q.equals(w)); //false      

我們執行個體了兩個學生對象,然後對象name都指派為“張三”,而我們也建立了兩個數組對象,裡面都是1、2、3,這樣看來如果用equals方法的話,應該都為true才對,但是我們的結果都為false,這是為什麼呢,讓我們點選對象或者數組調用的equals方法中去看看,如圖。

== 和 equals 的差別是什麼?面試篇(第二天)

我們可以看到對象和數組調用的equals方法都是Object類中的方法,而且Object類中的方法隻有一個對比位址的邏輯,沒有對比值的邏輯,是以如果我們沒有重寫equals方法的話,對象和數組都是用的Object類中的方法都是比較的位址,如果我們重寫equalse的話才可以在equals方法中寫比較值的邏輯,而String類型的equals方法本身就有比較值的邏輯,是以我們平時基本類型比較值的時候使用 == ,String類型比較值的時候使用equalse,如果要比較兩個對象是否相等直接使用equalse的話比較的是兩個對象的位址是否相等。

總結

如果大家想了解更多的有關JAVA方面的面試題與答案詳解請搜尋關注我的微信公衆号《小奇JAVA面試》裡面每天都會更新JAVA面試題,希望能夠幫助到大家。

繼續閱讀