<input id="0qass"><u id="0qass"></u></input>
  • <input id="0qass"><u id="0qass"></u></input>
  • <menu id="0qass"><u id="0qass"></u></menu>

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

    面試題 專欄收錄該內容
    12 篇文章 0 訂閱

    初級回答:
    == 判斷的是地址是否相同,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的背景圖,有想要的可以私信我,嘿嘿。。。
    在這里插入圖片描述

    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類中的,如下圖。
    在這里插入圖片描述
    就是說只有String類型的使用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方法都是Object類中的方法,而且Object類中的方法只有一個對比地址的邏輯,沒有對比值的邏輯,所以如果我們沒有重寫equals方法的話,對象和數組都是用的Object類中的方法都是比較的地址,如果我們重寫equalse的話才可以在equals方法中寫比較值的邏輯,而String類型的equals方法本身就有比較值的邏輯,所以我們平時基本類型比較值的時候使用 == ,String類型比較值的時候使用equalse,如果要比較兩個對象是否相等直接使用equalse的話比較的是兩個對象的地址是否相等。

    總結
    如果大家想了解更多的有關JAVA方面的面試題與答案詳解請搜索關注我的微信公眾號《小奇JAVA面試》里面每天都會更新JAVA面試題,希望能夠幫助到大家。
    在這里插入圖片描述

    • 0
      點贊
    • 3
      評論
    • 2
      收藏
    • 一鍵三連
      一鍵三連
    • 掃一掃,分享海報

    ??2020 CSDN 皮膚主題: 1024 設計師:白松林 返回首頁
    實付
    使用余額支付
    點擊重新獲取
    掃碼支付
    錢包余額 0

    抵扣說明:

    1.余額是錢包充值的虛擬貨幣,按照1:1的比例進行支付金額的抵扣。
    2.余額無法直接購買下載,可以購買VIP、C幣套餐、付費專欄及課程。

    余額充值
    多乐彩