java中==和equals的區(qū)別

???????在編程中我們經(jīng)常要比較兩個對象是否相等,對于什么時候用==,什么時候用equals總是把握不清楚,下面我們就詳細探究一下這兩者的區(qū)別。
???????1.Object 類的 equals 方法實現(xiàn)對象上差別可能性最大的相等關(guān)系;即,對于任何非空引用值 x 和 y,當且僅當 x 和y引用同一個對象時,此方法才返回 true(x == y 具有值 true)。注意:當此方法被重寫時,通常有必要重寫 hashCode 方法,以維護 hashCode 方法的常規(guī)協(xié)定,該協(xié)定聲明相等對象必須具有相等的哈希碼。
???????源碼:

public boolean equals(Object obj) {
        return (this == obj);
}

???????2、String中的equals()方法:public boolean equals(Object anObject)將此字符串與指定的對象比較。當且僅當該參數(shù)不為 null,并且是與此對象表示相同字符序列的 String 對象時,結(jié)果才為 true。
???????源碼(它對equals方法進行重寫):

 public boolean equals(Object anObject) {//anObject是傳進來的要進行比較的對象
           //如果當前對象和傳進來要進行比較的對象anObject是同一個對象(即地址相同eg同一輛汽車(只有一輛))則返回true
         if (this == anObject) {
                return true;
            }
            if (anObject instanceof String) {//如果傳進來的需要進行比較的對象anObject是String類的實例,則把anObject轉(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ù)類型,比較的是引用的地址是否相同(即是否是同一輛汽車(注意,只有一輛汽車));
???????下面對這幾種比較方法進行詳細的測試。

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é)果如下:


image.png

???????總結(jié)一下
???????1、對于基本數(shù)據(jù)類型,“==”比較的是兩者的值是否相等。
???????2、對于引用數(shù)據(jù)類型
?????????(1)“==”比較的是引用的地址是否相同(即是否是同一輛汽車(注意,只有一輛汽車));Object中的.equals()方法和"==’功能一樣
?????????(2)但是String類中的.equals()方法重寫了,比較的是兩個引用對象的內(nèi)容是否想同(即是否是完全相同的汽車(注意,有兩輛汽車,且一模一樣,完全相同))。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容