在看區別之前,首先來看下以下代碼:
public class TestEqual { /** * @param args * I am not responsible of this code. * They made me write it, against my will. */ public static void main(String[] args) { // TODO Auto-generated method stub String a = "111"; String b = "111"; String c = new String("111"); int a1 = 111; int b1 = 111; Integer c1 = new Integer(111); Integer c2 = new Integer(111); System.out.println(a == b); //true System.out.println(a == c); //false System.out.println(c == b); //false System.out.println(a.equals(c)); //true System.out.println("**************************"); System.out.println(a1 == b1); //true System.out.println(a1 == c1); //true System.out.println(c2 == c1); //false System.out.println(a.equals(c1)); //false System.out.println(c1.equals(c2)); //true } }
(一) "=="
首先先看定義的三個字符串對象,他們的值都是111。但a==b時,值為true 而 a==c時,為false,為什么呢?
String a = "111" 當表達式執行的時候,會首先去內存中的字符串池中去找,看有沒有"111"這個字符串,如果沒有的話,就在字符串池中創建一個,等String b = "111"時,則a,b其實是指向了同一片內存地址空間。而String c = new String("111")則不會去字符串池中查找,是直接創建一個"111",所以String c = new String("111")時,它會再創建一個,所以這時a,c指向的是不同的內存空間。
當==用於比較對象的引用時,實質上是比較兩個引用的地址是否相等。其中java的雙引號表達式本身就會創建一個字符串對象。
其次再看定義的兩個int型變量以及兩個Integer對象。a1==b1毫無疑問他兩值相等,為true。而a1==c1也為true,這又是為什么呢?
其實自jdk1.5之后,基本類型的所對應的引用類型可以自動轉換成基本類型與基本類型進行值比較.(自動拆箱)..而a1==c1實質上變成了a1== c1.intValue()
當==用於比較基本數據類型時,實質上就是比較他們的值是否相同。
(二)equal()
由a.equals(c)與c1.equals(c2)他們值為true,看出他們比較的對象是相同的。
equal()來判斷兩個對象是否相等。對於字符串來說,也是比較字符串的字符序列是否相等。
equals方法可以參考API中的java.lang.Object和java.lang.String。
參考: http://www.cnblogs.com/zhxhdean/archive/2011/03/25/1995431.html
http://blog.sina.com.cn/s/blog_79333b2c0100xd34.html
結果的得出與上邊敘述無關系,只做解釋而已