1. 程式人生 > >java中equals和==的區別

java中equals和==的區別

ML int .net 重寫 com span double str 文獻

(表達可能存在錯誤,需進一步完善)

1、首先搞清楚java裏面的數據類型包括:

基本數據類型引用數據類型

2、數據類型

基本數據類型

byte,short(2 byte),int(4 byte),long(8 byte),float(4 byte),double(8 byte),char(2 byte)

引用數據類型

String、date、對象。。。

3、“==” 來比較變量存儲的值是否相等

例1:基本數據類型int

int n=3;
int m=3;
System.out.println(n==m);

 打印的結果為true,比較的是n和m的存儲的值是否相等 

例2:

  • 引用數據類型string

註意:這些引用變量中存儲的並不是“值”本身

例如,動態創建一個字符串

String str1;
str1 = new String("hello");
String str2;
str2 = new String("hello");
System.out.println(str1==str2);

第一句表示的是聲明一個String類型的引用變量,沒有和任何對象關聯;

第二句表示新創建了一個String對象並將變量str1指向它,因此str1裏面存儲的不是“值”本身“hello”而是新創建的對象的內存地址;

每new一次都表示重新在內存中創建一個對象,所以str1和str2所指向的對象是不同的,也就是str1和str2存儲的值是不同的,返回false;

  • 靜態創建一個字符串:
1 String s1 = "hello";
2 String s2 = "hello";
3 System.out.println(s1==s2);

第一句表示在靜態方法區創建了一個“hello”字符串,並聲明了一個string變量s1指向它;

第二句聲明了一個string類型的變量s2,也會指向“hello”這個實例;

因此,最後s1==s2的結果返回true

技術分享圖片

4、equals比較的是是否指向同一個對象

equals是Object類裏的方法,下面是equals的源碼:

技術分享圖片

可見equals用來比較兩個對象的引用是否相等。

考慮下面的例子:

String s1 = new
String("hello"); String s2 = new String("hello"); System.out.println(s1.equals(s2));

結果為true。那是因為在String,Integer,Date類中都對equals方法進行了重寫,見下面源碼:

技術分享圖片

可以看出,String類對equals方法進行了重寫,比較的是指向對象存儲的字符串內容

其他的一些類諸如Double,Date,Integer等,都對equals方法進行了重寫用來比較指向的對象所存儲的內容是否相等。

5、總結

  1)對於==

    如果作用於基本數據類型的變量,則直接比較其存儲的 “”是否相等;

    如果作用於引用類型的變量,則比較的是所指向的對象的地址

  2)對於equals方法

    註意:equals方法不能作用於基本數據類型的變量

    如果沒有對equals方法進行重寫,則比較的是引用類型的變量所指向的對象的地址

    諸如String、Date等類對equals方法進行了重寫的話,比較的是所指向的對象的內容

 

參考文獻:http://www.cnblogs.com/dolphin0520/p/3592500.html

https://blog.csdn.net/qq_32907417/article/details/50672904

java中equals和==的區別