java中equals以及==的用法(簡單介紹)

來源:互聯網
上載者:User

標籤:java編程   abc   的區別   基本   com   基本類型   main   print   進一步   

簡單介紹equals方法是java.lang.Object類的方法有兩種用法說明:一、對於字串變數來說,使用“==”和“equals()”方法比較字串時,其比較方法不同。 1、“==”比較兩個變數本身的值,即兩個對象在記憶體中的首地址。(java中,對象的首地址是它在記憶體中存放的起始地址,它後面的地址是用來存放它所包含的各個屬性的地址,所以記憶體中會用多個記憶體塊來存放對象的各個參數,而通過這個首地址就可以找到該對象,進而可以找到該對象的各個屬性) 2、“equals()”比較字串中所包含的內容是否相同。

比如:

String s1,s2,s3 = "abc", s4 ="abc" ;s1 = new String("abc");s2 = new String("abc");s1==s2   是 false      //兩個變數的記憶體位址不一樣,也就是說它們指向的對象不 一樣,s1.equals(s2) 是 true    //兩個變數的所包含的內容是abc,故相等。

 

 String s1,s2,s3 = "abc", s4 ="abc" ;        s1 = new String("abc");        s2 = new String("abc");        System.out.println("s1==s2:"+(s1==s2));        System.out.println("s1==s3:"+(s1==s3));        System.out.println("s1==s4:"+(s3==s4));        System.out.println("s1.equals(s2):"+(s1.equals(s2)));        System.out.println("s1.equals(s3):"+(s1.equals(s3)));        System.out.println("s3.equals(s4):"+(s3.equals(s4)));

 

 測試圖

 

注意:
 StringBuffer s1 = new StringBuffer("a"); StringBuffer s2 = new StringBuffer("a"); System.out.println("s1.equals(s2):"+(s1.equals(s2)));//結果為false

 

 

解釋:StringBuffer類中沒有重新定義equals這個方法,因此這個方法就來自Object類, (Object類中的equals方法是用來比較“地址”的,所以等於false)注意:對於s3和s4來說,有一點不一樣要引起注意,由於s3和s4是兩個字元,串常量所產生的變數,其中所存放的記憶體位址是相等的,所以s3==s4是true(即使沒有s3=s4這樣一個指派陳述式)對於非字串變數來說,"=="和"equals"方法的作用是相同的都是用來比較其,對象在堆記憶體的首地址,即用來比較兩個引用變數是否指向同一個對象。

比如:

class A{      A obj1   =   new  A();      A obj2   =   new  A();}     obj1==obj2  //結果為false     obj1.equals(obj2)//是false   //但是如加上這樣一句:   obj1=obj2;     //執行後   obj1==obj2  //是true     obj1.equals(obj2) //是true

 

 1、equals方法對於字串來說是比較內容的,而對於非字串來說是比較,其指向的對象是否相同的。 2、 == 比較符也是比較指向的對象是否相同的也就是對象在對記憶體中的的首地址。  String類中重新定義了equals這個方法,而且比較的是值,而不是地址。所以是true。關於equals與==的區別從以下幾個方面來說: (1) 如果是基本類型比較,那麼只能用==來比較,不能用equals 比如: 
public class TestEquals { public static void main(String[] args) { int a = 3; int b = 4; int c = 3; System.out.println(a == b);//結果是false System.out.println(a == c);//結果是true System.out.println(a.equals(c));//錯誤,編譯不能通過,equals方法 //不能運用與基本類型的比較 } }
(2) 對於基本類型的封裝類型,比如Boolean、Character、Byte、Shot、Integer、Long、Float、Double等的引用變數,==是比較地址的,而equals是比較內容的。比如: 
public class TestEquals { public static void main(String[] args) { 
Integer n1 = new Integer(30); Integer n2 = new Integer(30); Integer n3 = new Integer(31); System.out.println(n1 == n2);//結果是false 兩個不同的Integer對象,故其地址不同, System.out.println(n1 == n3);//那麼不管是new Integer(30)還是new Integer(31) 結果都顯示false System.out.println(n1.equals(n2));//結果是true 根據jdk文檔中的說明,n1與n2指向的對象中的內容是相等的,都是30,故equals比較後結果是true System.out.println(n1.equals(n3));//結果是false 因對象內容不一樣,一個是30一個是31 } }
這是Integer的執行個體,如果是其他的比如Double、Character、Float等也一樣(3) 注意:對於String(字串)、StringBuffer(安全執行緒的可變字元序列)、StringBuilder(可變字元序列)這三個類作進一步的說明。 (4)該例子是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));//(1)flase System.out.println(v1 == v2);//(2)true } } 
運行結果疑問:乍一看結果,有點驚訝,為什麼不是true呢,不是說equals方法是比較內容的嗎? 解釋:不錯,如果在新類中被覆蓋了equals方法,就可以用來比較內容的。但是在上面的例子中類Value並沒有覆蓋Object中的equals方法,而是繼承了該方法,因此它就是被用來比較地址的,又v1和v2的所指向的對象不相同,故標記(1)處的v1.equals(v2)運行結果為false,標記為(2)處的v1 == v2運行結果也為false。 總結:  如果是基本類型比較,那麼只能用==來比較,不能用equals ,如果是基本類型的封裝類型,那麼用equals 

java中equals以及==的用法(簡單介紹)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.