Java中==和equals的區別
阿新 • • 發佈:2020-08-21
介紹
首先==和equals可以比較基礎資料型別,比如int a =1,也可以比較引用資料型別,比如Object a = new Object(),
那我們就分別看一下在比較基礎資料型別和引用資料型別時有什麼區別.
分析
這是一道常見的面試題,要明白==和equals的區別,先看一下原始碼,equals是Object類的方法,看一下Object類的原始碼.
public boolean equals(Object obj) { return (this == obj); }
可以看到在Object類中也是呼叫==方法,由於所有的類都繼承自Object類,只要不重寫equals方法,equals和==是一樣的,因此可以得到結論1:
對於所有沒有重寫equals方法的類,equals方法和==是一樣的,沒有任何區別,無論是比較引用型別還是基礎資料型別.
那麼對於重寫了equals方法的類呢,String,Integer類都重寫了,我們以String類為例子,來看一下String類的原始碼.
可以看到String類把傳進來的String物件和自己轉換成字元陣列,然後再依次比較兩者是否相等,也就是說比較兩者的內容是否相等,而不是去比較地址.
Integer類同理,也是比較值是否相等,而不是去比較地址了.
我們測試一下:
public class Test3 { public static void main(String[] args) { String s1= "abc"; String s2 = new String("abc"); System.out.println(s1 == s2); System.out.println(s1.equals(s2)); } }
對於s1和s2兩者內容相同,但是地址不一樣,因此==輸出為flase,equals輸出為true.因此String的equals是比較字串內容是否一樣.
總結:
1.對於基礎資料型別:equals和==是一樣的,比較的就是基本型別的值
2.對於引用型別:如果沒有重寫equals方法,equals和==是一樣的,比較的是引用型別指向的地址是否一致.
如果重寫了equals方法,那麼equals是比較內容是否一致,==比較地址是否一致.