在JAVA中“==”對於基本數據類型來說,比較的是值的大小是否相同;但對於對象來說,比較的卻是對象的句柄,而並非對象的內容,所以如下代碼:
import java.util.*;
public class Project4 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Integer n1 = new Integer(49);
Integer n2 = new Integer(49);
System.out.println(n1 == n2);
System.out.println(n1 != n2);
}
}
很多人按照常理來說都會認爲輸出的是true和false,但是答案卻是相反的,正確輸出結果爲:
原因就是“==”比較的是對象的句柄,儘管n1和n2對象的值相同,但創建對象時的句柄不同,則判斷爲false。那麼該如何比較對象中的內容的值呢?需要用到對象的通用方法equlas()方法,所以,在代碼後加入一句:
import java.util.*;
public class Project4 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Integer n1 = new Integer(49);
Integer n2 = new Integer(49);
System.out.println(n1 == n2);
System.out.println(n1 != n2);
System.out.println(n1.equals(n2));
}
}
此時再看此程序的輸出結果:
可以看到在輸出equals()方法時,實際比較的是對象的值,這個問題得以解決,但是,仍然存在另一個問題,單獨的equals()方法默認比較的仍然是句柄而並非對象的值,sun公司在編寫JAVA類庫的時候equals()方法進行了大部分的重寫,使得它的比較爲對象的值,那麼如果我們自己創建一個類,進行equals()方法使用的時候仍然會出現一些問題,比如如下代碼:
import java.applet.*;
class Value{
int i;
}
public class project5 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Value n1 = new Value();
Value n2 = new Value();
n1.i=n2.i=49;
System.out.println(n1.equals(n2));
}
}
我們的本意是想比較兩個對象的值,但是此時的輸出爲:
所以,對於equals()方法默認仍然爲比較對象的句柄,我們必須通過自己在自己的類中重寫equals()方法才能使它達到我們的要求,在實際的編程中如果不注意這一細節,那麼會導致局部的輸出問題。