java關係操作符==和equals()區別
阿新 • • 發佈:2018-12-21
在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;