介紹
首先==和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是比較內容是否一致,==比較地址是否一致.