1. 程式人生 > >java關係操作符==和equals()區別

java關係操作符==和equals()區別

    在java中包含的關係操作符有小於(<)、大於(>)、小於或等於(<=)、大於或等於(>=)、等於(==)以及不等於(!=)。

物件的等價性:

    ==和!=適用所有物件,但是這兩個操作符通常在比較物件的時候會出問題,下面一個列子:

public class Test {
	public static void main(String[] args) {
		String s1=new String("xxxx1");
		String s2=new String("xxxx1");
		System.out.println(s1==s2);
		System.out.println(s1!=s2);
	}
}

輸出:false

           true

在這裡==和!=比較的是物件的引用。儘管物件的內容相同,但是物件的引用卻是不同的,說以s1==s2是false。

如果想比較兩個物件的實際內容是否相同,此時,必須使用所有物件都適用的特殊方法equals()。但這個方法不適用於“基本型別”,基本型別直接使用==和!=即可,列子:

public class Test {
	public static void main(String[] args) {
		String s1=new String("xxxx1");
		String s2=new String("xxxx1");
		System.out.println(s1.equals(s2));
	}
}

輸出:true

但是也有例外!!!!!!

假如你建立了自己的類,就想下面這樣:

public class Test {
	 static int i;
	 static class EqualsMethod2{
		public static void main(String[] args) {
			Test t1=new Test();
			Test t2=new Test();
			t1.i=t2.i=100;
			System.out.println(t1.equals(t2));
		}	
	 }
}

輸出:false

這是由於equals()的預設行為是比較引用。所以除非在自己的新類中覆蓋equals()方法,否則不可能表現出我們希望的行為。

大多數java類庫都實現了equals()方法,以便用來比較物件的內容,而非比較物件的引用,

最後需要我們自己實現equals()方法,如下:

public class Test {
	 static int i;
	 static class EqualsMethod2{
		public static void main(String[] args) {
			Test t1=new Test();
			Test t2=new Test();
			t1.i=t2.i=100;
			System.out.println(t1.equals(t2));
		}	
	 }
	@Override
	public boolean equals(Object obj) {
		// TODO Auto-generated method stub
		if(this==obj){
			return true;
		}
		if(obj instanceof Test){
			Test tx=(Test) obj;
			int t1=this.i;
			int t2=tx.i;
			if(t1==t2){
				return true;
			}else{
				return false;
			}
		}
		return false;
	}
}
 

這樣,輸出就是:true;