天天看點

java == equals_Java中==與equals()的差別

聲明轉載來源:http://blog.csdn.net/striverli/article/details/52997927

==号和equals()方法都是比較是否相等的方法,那它們有什麼差別和聯系呢?

首先,==号在比較基本資料類型時比較的是值,而用==号比較兩個對象時比較的是兩個對象的位址值:

int x = 10;

int y = 10;

String str1 = new String("abc");

String str2 = new String("abc");

System.out.println(x == y); // 輸出true

System.out.println(str1 == str2); // 輸出false

1

2

3

4

5

6

那equals()方法呢?我們可以通過檢視源碼知道,equals()方法存在于Object類中,因為Object類是所有類的直接或間接父類,也就是說所有的類中的equals()方法都繼承自Object類,而通過源碼我們發現,Object類中equals()方法底層依賴的是==号,那麼,在所有沒有重寫equals()方法的類中,調用equals()方法其實和使用==号的效果一樣,也是比較的位址值,然而,Java提供的所有類中,絕大多數類都重寫了equals()方法,重寫後的equals()方法一般都是比較兩個對象的值:

java == equals_Java中==與equals()的差別

這裡我自己定義了一個Student類,沒有重寫equals()方法,最後的輸出結果是:false

java == equals_Java中==與equals()的差別

在我重寫了equals()方法後,輸出結果變成了true。

現在一些基本的已經講的差不多了,接下來我們回到第一個例子:

String str1 = new String("abc");

String str2 = new String("abc");

System.out.println(s1.equals(s2));

System.out.println(s1 == s2);

1

2

3

4

根據上面所講,第一個是true,第二個是false,确實如此,那繼續看下面的例子:

String s1 = "abc";

String s2 = "abc";

System.out.println(s1.equals(s2));

System.out.println(s1 == s2);

1

2

3

4

這次的結果和上一個的是一樣的嗎?答案是:true true

為什麼第二個會是true呢?

這就涉及到了記憶體中的常量池,常量池屬于方法區的一部分,當運作到s1建立對象時,如果常量池中沒有,就在常量池中建立一個對象”abc”,第二次建立的時候,就直接使用,是以兩次建立的對象其實是同一個對象,它們的位址值相等。

那上一個例子中的

String str1 = new String("abc");

1

是怎麼回事呢?

這裡其實建立了兩次對象,依次是在常量池中建立了對象”abc”,一次是在堆記憶體中建立了對象str1,是以str1和str2的位址值不相等。