標籤:java equals equals和區別
一句話概括:
如果操作兩邊都是物件控點,就比較兩個控制代碼是否指向同一個對象。如果兩邊是基本類型,則比較的就是值。
==不屬於任何類,而equals則是任何類(Java中)的一個方法。
equals()是每個對象與生俱來的方法,因為所有類的最終基類就是Object(除去Object本身);而equals()是Object的方法之一。
我們可以這樣比較:
1)Primitive1(基本類型)== Primitive2(基本類型)
2)Object1 Reference1(對象引用)== Object1 Reference2(對象引用)
3)Object1 Reference1(對象引用).equals(Object1 Reference2(對象引用))
但是卻不能這麼比較:
Primitive1(基本類型).equals(Primitive2(基本類型))
然後下面看具體的比較
基礎資料型別 (Elementary Data Type)的值:
int a = 4; int b = 4; System.out.println(a==b); //True
對於基礎資料型別 (Elementary Data Type)的值只能用“==”比較子進行比較。
參考型別的值的比較
Test t1 = new Test(); Test t2 = new Test(); System.out.println(t1==t2); //Fasle System.out.println(t1.equals(t2)); //False
兩句的結果都是False。
原因:
第一句:用new操作符建立的對象都會在記憶體中分配一個新的記憶體位址,所以兩個對象的記憶體位址不同,為fasle.
第二句:必須明確equals到底比較的是對象的什麼~~
看一看Object類的equals方法源碼:
public boolean equals(Object obj) { return (this == obj); }
內部使用的也是==比較的,所以equals和==在對象的比較上是一樣。
那equals還有什麼用?
每個對象都有自己的記憶體,但是每個對象也都有自己的一些屬性。
比如說,馬和牛都有腿,我們希望通過腿的數量來判斷馬和牛這兩個對象是否相同。
這個時候,再使用Object類中的equals方法就不能夠滿足需求了。就需要通過覆蓋equals的方式,建立兩個對象比
較相同的具體內容。
執行個體如下:
//馬類 class Horse{String Type;int Legs;//相等的標準,腿的數目相等public boolean equals(Object o){if(this.Legs==((Cattle)o).Legs){return true;}return false;}public Horse(String Type,int legs){this.Type=Type;this.Legs=legs;}}//牛類class Cattle{String Type;int Legs;//相等的標準,腿的數目相等public Cattle(String Type,int legs){this.Type=Type;this.Legs=legs;}public boolean equals(Object o){if(this.Legs==((Horse)o).Legs){return true;}return false;}}public class EqualsTest{ public static void main(String[] args){ Cattle c = new Cattle("I am the Cattle",4);Horse h = new Horse("I am the Horse",4);if(c.equals(h)){System.out.println(c.Type);System.out.println(h.Type);System.out.println("Cattle Equals Horse");}}}
最終的結果:
"I am the Cattle"
"I am the Horse"
"Cattle Equals Horse"
通過上面這個用equals方法將風馬牛不相等的事物變得相等,我們可以看出,其實對象是否相等,取決於使用者的需
求。我們定義什麼樣的標準,電腦就會踏踏實實的為我們實現。
所以,在用Java的類描述對象的時候,如果要判斷該對象是否相同時,通常都會覆蓋equals方法,建立根據該對
象特徵進行比較相同的依據。
新手學Java(一)——Equals和“==”的區別