java中equals和==的區別
(表達可能存在錯誤,需進一步完善)
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 = newString("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和==的區別