??????????????????????? ==與equals的區別
?????????????????????????????????????????????????????????????????????????????????? 整理
?
==:
u?????? 比較的是操作符兩端的操作數是否是同一個對象
u?????? 兩邊的操作數必須是同一類型的(可以是父子類之間)才能編譯通過。
u?????? 比較的是地址,如果是具體的阿拉伯數字的比較,值相等則為TRUE,如:
?????? int a=10 與 long b=10L 與 double c=10.0都是相同的(為true),因為他們都指向地址為10的堆
?
= =操作符專門用來比較變量的值是否相等。比較好理解的一點是:
int a=10;
int b=10;
則a= =b將是true。
但不好理解的地方是:
String a=new String("foo");
String b=new String("foo");
則a= =b將返回false。
???? 由于基本類型不是對象,即不存在引用,所以==運算符只會比較兩個基本類型的值
?? 對象變量其實是一個引用,它們的值是指向對象所在的內存地址,而不是對象本身。a和b都使用了new操作符,意味著將在內存中產生兩個內容為"foo"的字符串,既然是“兩個”,它們自然位于不同的內存地址。a和b的值其實是兩個不同的內存地址的值,所以使用"= ="操作符,結果會是 false。誠然,a和b所指的對象,它們的內容都是"foo",應該是“相等”,但是==操作符并不涉及到對象內容的比較。
?
equals:
1、比較的是兩個對象的內容是否一樣
equals是調用該對象的equals()方法執行的結果,該對象所屬類可以重寫equal方法
看object類中定義的equals源代碼:
public boolean equals(Object obj) {
??????? return (this == obj);
??? }
Object 對象默認使用了= =操作符。所以如果你自創的類沒有覆蓋equals方法,那你的類使用equals和使用==會得到同樣的結果。所以你定義的類有用到equals方法,建議重寫Object中的equals方法,同樣也可以看出, Object的equals方法沒有達到equals方法應該達到的目標:比較兩個對象內容是否相等。因為答案應該由類的創建者決定,所以Object把這個任務留給了類的創建者。
看一下一個極端的類:
Class Monster{
private String content;
...
boolean equals(Object another){ return true;}
}
我覆蓋了equals方法。這個實現會導致無論Monster實例內容如何,它們之間的比較永遠返回true。
所以當你是用equals方法判斷對象的內容是否相等,請不要想當然。因為可能你認為相等,而這個類的作者不這樣認為,而類的equals方法的實現是由他掌握的。如果你需要使用equals方法,或者使用任何基于散列碼的集合(HashSet,HashMap,HashTable),請察看一下java doc以確認這個類的equals邏輯是如何實現的。