JAVA中“==”和equals()的區別

在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()方法才能使它達到我們的要求,在實際的編程中如果不注意這一細節,那麼會導致局部的輸出問題。











發佈了52 篇原創文章 · 獲贊 6 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章