Java中“==”與equals()的區別
對於關係運算元“==”,《Java程式設計思想》中是這樣描述的:「關係運算子產生的是一個boolean結果,它們計算的是操作數的值之間的關係」。這裡的操作數的「值」值得我們注意。對於8種基本資料型態(boolean,byte,char,short,int,float,double,long),它們的變數直接儲存的就是「值」。所以,我們用「==」比較基本資料型別的變數時,實際比較的就是變數儲存的值,例如:
public static void main(String[] args) { int a = 5, b = 5; System.out.println(a == b); }
很明顯,程式會輸出:true。但是,下面這段程式碼呢?
public static void main(String[] args) { Integer c = new Integer(5), d = new Integer(5); System.out.println(c == d); }
我們運行程序,發現輸出的是:false。這是因為Integer並非Java中的基本資料類型,其變數c、d在Java中稱為指向物件的引用,其儲存的「值」是物件在記憶體中的位址,而非值「5」本身。所以,c和d實際儲存的分別是兩個value值都為「5」的Integer物件的位址,這兩個物件不在同一塊記憶體空間,「==」比較的結果自然是false了。
那麼equals()方法比較的是什麼呢? equals()是基底類別Object中定義的方法,在Object類別中,equals()方法定義為:
public boolean equals(Object obj) { return (this == obj); }
這等價於「==」。其實,equals()方法的意義在於重寫,否則對equals()的呼叫是沒有意義的。例如,繼承自Object的Integer類別便重寫了equals()方法:
public boolean equals(Object obj) { if (obj instanceof Integer) { return value == ((Integer)obj).intValue(); } return false; }
該方法的意義是對value值進行比較,那麼如果我們對於兩個具有相同value值的Integer物件呼叫equals( )進行比較:
public static void main(String[] args) { Integer c = new Integer(5), d = new Integer(5); System.out.println(c.equals(d)); }
結果是true。
感謝閱讀,希望能幫助大家,謝謝大家對本站的支持!
更多詳解Java中「==」與equals()的區別相關文章請關注PHP中文網!