JAVA equals 和 == 的區別以及實現原理(String 中equlas方法的源碼解析)

點開這篇文章的同學們大概是已經發現了JAVA中的== 與其他語言中的 == 有不一致的地方了。下面我們就來說說在JAVA中怎麼比較兩個參數是否相等。

面試題:JAVA中==和equals的區別
答:

  • == 應用在基礎數據類型中,比較的是他們的值,應用在引用數據類型中比較的是存儲對象的內存地址;
  • 基礎數據類型中不能使用equals方法,只有引用數據類型纔可以使用equals,因爲Object是所有類的始祖,Object中的equlas方法本質其實還是==,所以如果不重寫equals方法,那麼它其實跟==一樣是比較存儲對象的內存地址。而我們通常會重寫equals方法,讓他變成值比較。比如String,Integer中就重寫了equlas方法。

先了解下JAVA中的數據類型

JAVA中的數據類型有兩種,分別是基本數據類型和引用數據類型

基本數據類型

一共八種,分別是:byte,short,int,long,float,double,boolean,char
基本數據類型變量名指向具體的值

引用數據類型

一共三種,分別是:類,數組,接口(如String,String[],Integer等)
引用數據類型變量名指向存儲對象的內存地址

接下來回歸到我們原來的問題,先看“==”是怎麼處理基本數據類型,引用數據類型的比較的

==

上面我們已經瞭解到了,基本數據類型變量名指向值,而引用數據類型變量名指向存儲對象的地址
所以對於基本數據類型,==比較的就是值,而對於引用數據類型,==比較的就是 存儲他們的地址。

代碼示例

int a = 1;
int b = 1;
boolean ab = a == b;
System.out.println(ab) // 打印出來 ab爲true,比較的是變量a,b的值
Integer c = 1;
Integer d = 1;
Integer e = new Integer(1);
boolean cd = c == d;
boolean ce = c == e;
System.out.println(cd)  // 打印出來 cd 爲true,c,d 指向的是同一個引用,所以地址相同
System.out.println(ce )  // 打印出來 cd 爲false,c,e指向的是不同的引用,所以地址不同

equals

Object類是Java中所有類的始祖,JAVA中每個類都擴展了Object,在Object中equals就跟==一樣,但是很多類,比如String,Integer這些都是重寫了equals方法的

下面我們看下Object,String類中equlas部分的源碼

// Object 類中的equlas源碼,從return語句可看出本質其實就是==
 public boolean equals(Object obj) {
		 //從這可以看出其實就是用了==
        return (this == obj);    
 }

比如要比較String a = “aaa”,String b = "bbb"是否相等,a.equals(b)

// String類中的equlas源碼
 public boolean equals(Object anObject) {
 	// 先比較兩個參數的引用是否一樣,如果一樣那肯定相等,return true即可,不需要再比較
    if (this == anObject) {
        return true;
    }
    // 如果兩個參數的引用不一致,比較他們的值
    // 先判斷要比較的參數是否是String類型,如果不是肯定不相等,如果是,則繼續執行
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        // 此處value 是個全局變量,char[]類型的,存儲的是equlas左邊的變量(a.equals(b),value 存儲的就是a的字符)
        // n = 字符串a的長度
        int n = value.length;
        // 字符串a的長度和字符串b的長度一致,則繼續,否則不相等
        if (n == anotherString.value.length) {
            // 字符串a賦值給v1
            char v1[] = value;
            // 字符串b賦值給v2,anotherString.value把字符串b轉換爲了char[] 類型
            char v2[] = anotherString.value;
            int i = 0;
            // 循環比較兩個字符數組中每個字符是否相等,若存在不相等則肯定不相等,反之相等
            while (n-- != 0) {
                if (v1[i] != v2[i])
                    return false;
                i++;
            }
            return true;
        }
    }
    return false;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章