???????在編程中我們經(jīng)常要比較兩個對象是否相等捌浩,對于什么時候用==快集,什么時候用equals總是把握不清楚际度,下面我們就詳細(xì)探究一下這兩者的區(qū)別葵袭。
???????1.Object 類的 equals 方法實現(xiàn)對象上差別可能性最大的相等關(guān)系;即甲脏,對于任何非空引用值 x 和 y眶熬,當(dāng)且僅當(dāng) x 和y引用同一個對象時,此方法才返回 true(x == y 具有值 true)块请。注意:當(dāng)此方法被重寫時娜氏,通常有必要重寫 hashCode 方法,以維護(hù) hashCode 方法的常規(guī)協(xié)定墩新,該協(xié)定聲明相等對象必須具有相等的哈希碼贸弥。
???????源碼:
public boolean equals(Object obj) {
return (this == obj);
}
???????2、String中的equals()方法:public boolean equals(Object anObject)將此字符串與指定的對象比較海渊。當(dāng)且僅當(dāng)該參數(shù)不為 null绵疲,并且是與此對象表示相同字符序列的 String 對象時哲鸳,結(jié)果才為 true。
???????源碼(它對equals方法進(jìn)行重寫):
public boolean equals(Object anObject) {//anObject是傳進(jìn)來的要進(jìn)行比較的對象
//如果當(dāng)前對象和傳進(jìn)來要進(jìn)行比較的對象anObject是同一個對象(即地址相同eg同一輛汽車(只有一輛))則返回true
if (this == anObject) {
return true;
}
if (anObject instanceof String) {//如果傳進(jìn)來的需要進(jìn)行比較的對象anObject是String類的實例盔憨,則把a(bǔ)nObject轉(zhuǎn)換成String類型
String anotherString = (String) anObject;
//value是一個private final char value[];
//String類的構(gòu)造函數(shù)已經(jīng)給value[]初始化了
//value.length代表原先要比較對象的字符個數(shù)
int n = value.length;
//如果兩者的字符個數(shù)不相等徙菠,意味著兩者不可能相等,所以返回false郁岩;否則婿奔,依次遍歷比較兩者的每一個字符,若每一個字符都相等則相等问慎,否則不想等
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
???????3.==對于基本數(shù)據(jù)類型萍摊,比較的是兩者的值是否相等,對于引用數(shù)據(jù)類型如叼,比較的是引用的地址是否相同(即是否是同一輛汽車(注意冰木,只有一輛汽車));
???????下面對這幾種比較方法進(jìn)行詳細(xì)的測試笼恰。
package Demo;
import java.util.ArrayList;
import java.util.Stack;
class person{
private String name;
private int age;
person(String name , int age){
this.name=name;
this.age=age;
}
}
public class DemoStringEquals {
public static void main(String[] args) {
test2();
}
public static void test2(){
//基本數(shù)據(jù)類型
int a = 5;
int b = 6;
int c = 5;
System.out.println("a==b:"+(a==b));
System.out.println("a==c:"+(a==c));
//類類型變量
person p1=new person("a",1);
person p2=new person("a",1);
System.out.println("p1==p2:"+(p1==p2));
System.out.println("p1.equals(p2):"+p1.equals(p2));
//String 類重寫了equals()方法
//str1和str2是兩個不同的類(即共兩輛汽車)踊沸,但是str1和str2的內(nèi)容相同,都是"a"(即挖腰,這兩輛汽車一模一樣雕沿,完全相同)
String str1= new String("a") ;
String str2= new String("a");
String str3= "ab" ;
String str4= "ab" ;
String str5= "1" ;
String str6= "1" ;
String str7= "22" ;
String str8= "22" ;
String str9= "" ;
String str10= " " ;
String str11= null ;
String s=str1;
//==比較的是對象,.equals()比較的是內(nèi)容
System.out.println("str1==str2 : "+(str1==str2));
System.out.println("str1.equals(str2) : "+(str1.equals(str2)));
System.out.println("str1==str3 : "+(str1==str3));
System.out.println("str1.equals(str3) : "+(str1.equals(str3)));
System.out.println("str1==str10 : "+(str1==str10));
System.out.println("str1.equals(str10): "+(str1.equals(str10)));
System.out.println("str1==str11 : "+(str1==str11));
System.out.println("str1.equals(str11) : "+(str1.equals(str11)));
System.out.println("str10.equals(str11) : "+(str10.equals(str11)));
System.out.println("str1==s : "+(str1==s));
System.out.println("str1==str11 : "+(str1==str11));
System.out.println("str1.equals(s) : "+(str1.equals(s)));
System.out.println("str1.equals(a) : "+(str1.equals("a")));
System.out.println("str1==a : "+(str1=="a"));
System.out.println("str11==null : "+(str11==null));
System.out.println("str11!=null : "+(str11!=null));
//System.out.println("str11.equals(null): "+(str11.equals(null)));//Exception in thread "main" java.lang.NullPointerException 不能是Null.equals()
}
}
???????結(jié)果如下:
???????總結(jié)一下
???????1猴仑、對于基本數(shù)據(jù)類型,“==”比較的是兩者的值是否相等肥哎。
???????2辽俗、對于引用數(shù)據(jù)類型
?????????(1)“==”比較的是引用的地址是否相同(即是否是同一輛汽車(注意,只有一輛汽車))篡诽;Object中的.equals()方法和"==’功能一樣
?????????(2)但是String類中的.equals()方法重寫了崖飘,比較的是兩個引用對象的內(nèi)容是否想同(即是否是完全相同的汽車(注意,有兩輛汽車杈女,且一模一樣朱浴,完全相同))。