在比較字符型數(shù)據(jù)時,==比較的是內(nèi)存中的地址,比較的是對象的句柄;而equals()比較的是地址內(nèi)的內(nèi)容,比較的是對象。由于JAVA中除基本數(shù)據(jù)類型外其它一切都是對象,而對象變量存儲的都是引用,相當于C中的指針,所以在比較對象時如String,用==是比較兩個變量是否指向同一個對象,而用equals才是比較兩個String的內(nèi)容是否相等。
      ==絕對比equals快。
      ==是java內(nèi)置的,可以理解為"相同"。對于簡單類型來說,a=3,b=3,我們可以說a和b相同,也可以說a和b相等,都沒什么問題。.equals()是Object的方法,可以理解為"相等"。顯然兩個object相等并不意味著相同;但是需要注意的是,也并不意味著他們對應內(nèi)存區(qū)域的所有字節(jié)都相等,比如(但不限于這個原因)他們內(nèi)部可能還有自己的引用。所以,兩個對象是否相等,只有這個對象自己才知道如何判斷,java并不知道。所以就需要類自己提供一個equals方法。下面舉例說明:

題目:
  Integer     new   Integer(42)  
  Long     new   Long(42)  
  Double     new   Double(42.0)  
  下面哪些返回true  
  1:   i==l  
  2:   i==d  
  3:   l==d  
  4:   i.equals(l)  
  5:   i.equals(d)  
  6:   l.equals(d)  
  7:   i.equals(42)  
答案:7;

編碼驗證:
public   class   Equivalence     
   public   static   void   main(String[]   args)   
      Integer     new   Integer(42)  
      Long     new   Long(42)  
      Double     new   Double(42.0)  
      System.out.println(i==l);  
      System.out.println(i==d);
      System.out.println(l==d);  
      System.out.println(i.equals(l) );   
      System.out.println(i.equals(d) );
      System.out.println(l.equals(d) );  
      System.out.println(i.equals(42));
  


運行結(jié)果:
1-3:編譯不通過;
4-6:false
7:true

原理解釋:
1.   檢查對象是否相等
關(guān)系運算符==和!=也適用于所有對象,但它們的含義通常會使初涉Java領(lǐng)域的人找不到北。下面是一個例子:
//:   Equivalence.java  
public   class   Equivalence   
   public   static   void   main(String[]   args)   
      Integer   n1    new   Integer(47);  
      Integer   n2    new   Integer(47);  
      System.out.println(n1   ==   n2);  
      System.out.println(n1   !=   n2);  
   }  
  ///:~
      其中,表達式System.out.println(n1 == n2)可打印出內(nèi)部的布爾比較結(jié)果。一般人都會認為輸出結(jié)果肯定先是true,再是false,因為兩個Integer對象都是相同的。但盡管對象的內(nèi)容相同,句柄卻是不同的,而==和!=比較的正好就是對象句柄。所以輸出結(jié)果實際上先是false,再是true。這自然會使第一次接觸的人感到驚奇。
      若想對比兩個對象的實際內(nèi)容是否相同,又該如何操作呢?此時,必須使用所有對象都適用的特殊方法equals()。但這個方法不適用于“主類型”,那些類型直接使用==和!=即可。下面舉例說明如何使用:
//:   EqualsMethod.java 
public   class   EqualsMethod   
   public   static   void   main(String[]   args)   
      Integer   n1    new   Integer(47);  
      Integer   n2    new   Integer(47);  
      System.out.println(n1.equals(n2));  
   }  
  ///:~  
正如我們預計的那樣,此時得到的結(jié)果是true。但事情并未到此結(jié)束!假設(shè)您創(chuàng)建了自己的類,就象下面這樣:
//:   EqualsMethod2.java 
class   Value   
   int   i;  
}
public   class   EqualsMethod2   
   public   static   void   main(String[]   args)   
      Value   v1    new   Value();  
      Value   v2    new   Value();  
      v1.i    v2.i    100;  
      System.out.println(v1.equals(v2));  
   }  
  ///:~  
此時的結(jié)果又變回了false!這是由于equals()的默認行為是比較句柄。所以除非在自己的新類中改變了equals(),否則不可能表現(xiàn)出我們希望的行為。但要注意equals()的這種行為方式同時或許能夠避免一些“災難”性的事件。     
      大多數(shù)Java類庫都實現(xiàn)了equals(),所以它實際比較的是對象的內(nèi)容,而非它們的句柄。
      在java中內(nèi)存分為“棧”和“堆”(Stack   and   Heap) ,基本數(shù)據(jù)類型存儲在"棧"中,對象引用類型實際存儲在"堆"中,在“棧”中只是保留引用內(nèi)存的地址值,就好像知道你家門牌號碼就可以找到你家。在Java中利用"=="比較變量時候,系統(tǒng)使用變量在stack(棧)中所存的值來作為對比的依據(jù),基本數(shù)據(jù)類型(int   float   double   boolean)在stack中所存的值就是其內(nèi)容值,而引用類型在stack中所存放的值是本身所指向Heap中對象的地址值,而不是原先所設(shè)定的值。

PS  
1:
      ==基本類型之間的比較包括int,short,reference等  
      equals()是對象之間的比較,缺省(Object中)的是對象引用的比較,但是可以重載。  
2:
      equals()和==在語義上是不同的,==是作為標識符嵌入到j(luò)ava語言的語法中,
      而equals()是作為一個類方法實現(xiàn)。java的指稱語義,必須描述==,但是不用描述equals()方法。