Java物件之間的比較之equals和==

小弟季義欽發表於2012-10-31
/**
 * 
 */
package string;

/**
 * @author Administrator
 * “==” 比較引用,即判斷是否指向同一個物件
 * “equals()” 預設是比較引用,包裝類重寫了這些方法,比較物件內容,我們自己的類一般也重寫equals方法
 *
 * equals方法屬於Object類,預設的是比較兩個物件引用是否相等,即是否指向同一個物件
 * 和使用==號來比較的結果是一樣的。
 * 
 * 對於String,Integer等包裝型別來說,他們已經重寫了Object的equals方法,根據內容判斷是否相等。
 * 
 * 所以一般來說,對於自己實現的類,要想在某些情況下比較返回true,必須重寫equals方法。
 * 某些情況下,重寫equals方法最好吧hasCode()也重寫了,比如要存入Map/Set的時候。
 */
//沒有重寫equals的物件
class CompareObject1{
	int v;
	public CompareObject1(int v){
		this.v = v;
	}
}

//重寫equals的物件
class CompareObject2{
	int v;
	public CompareObject2(int v){
		this.v = v;
	}
	
	public boolean equals(Object o){
		CompareObject2 c = (CompareObject2)o;
		return this.v == c.v? true:false;
	}
}

public class EqualsTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		//普通物件比較
		CompareObject1 c1 = new CompareObject1(1);
		CompareObject1 c2 = new CompareObject1(1);
		System.out.println(c1 == c2); 		//引用不同
		System.out.println(c1.equals(c2)); 	//引用不同
		
		//String比較
		String s1 = new String("hello");
		String s2 = new String("hello");
		System.out.println(s1 == s2);		//引用不同
		System.out.println(s1.equals(s2));	//裡面的值相同,重寫過equals方法
		
		
		//Integer比較
		Integer int1 = new Integer(1);
		Integer int2 = new Integer(1);
		System.out.println(int1 == int2);		//引用不同
		System.out.println(int1.equals(int2));	//裡面的值相同,重寫過equals方法
		
		//重寫了equals方法的普通物件的比較
		CompareObject2 o1 = new CompareObject2(1);
		CompareObject2 o2 = new CompareObject2(1);
		System.out.println(o1 == o2); 			//引用不同
		System.out.println(o1.equals(o2)); 		//裡面的值相同,重寫過equals方法
	}
}
/**
 * Output:
false
false
false
true
false
true
false
true
 * */

相關文章