首頁 > Java > Java基礎 > 主體

java中關於==和equals的分析

王林
發布: 2019-11-27 16:21:07
轉載
1805 人瀏覽過

java中關於==和equals的分析

==的分析

1、對於基本資料類型,比較的是他們的具體內容是不是一樣,跟他們的內存地址無關。

舉例:

public class Test{
	
	public static void main(String[] args) {
		int i = 10;
		double j = 10.0;
		float m = 10.0f;
		char k = 10;
		boolean b = true;
		
		System.out.println(i == j);
		System.out.println(i == m);
		System.out.println(m == k);
		System.out.println("*******************");
		//System.out.println(i == b);  很明显,布尔型不能和其他基本数据类型比较,编译报错.
		System.out.println(System.identityHashCode(i));
		System.out.println(System.identityHashCode(j));
		System.out.println(System.identityHashCode(m));
		System.out.println(System.identityHashCode(k));
		System.out.println(System.identityHashCode(b));
	}
}
登入後複製

輸出:

true
true
true
*******************
366712642
1829164700
2018699554
1311053135
118352462
登入後複製

相關影片教學推薦:java免費影片教學

分析:

①根據比較的結果和記憶體位址來看,內容一樣,記憶體位址不一樣,但回傳的結果都是true,說明比較的時候只看變數中儲存的內容是否相同,而跟記憶體位址無關。

②==比較的兩邊資料需要能強制轉換成同一型,例如int和double的比較,會強制轉換到double。

③布林類型不能和int,float,double,char等基本資料型別做比較,編譯就報錯。

2、對於引用資料型別的比較:

public class Test{
	
	public static void main(String[] args) {
		Test t1 = new Test();
		Test t2 = new Test();
        String name1 = "琼宝";
		String name2 = "琼宝";
		
		System.out.println(name1 == name2);						 // true
		System.out.println(System.identityHashCode(name1));		 //366712642	
		System.out.println(System.identityHashCode(name2));		 //366712642
		
		System.out.println(t1 == t2);                             //false
		System.out.println(System.identityHashCode(t1));          //366712642
		System.out.println(System.identityHashCode(t2));          //1829164700
        System.out.println(System.identityHashCode(new Test()));  //2018699554
		System.out.println(System.identityHashCode(new Test()));  //1311053135
        System.out.println(new Test() == new Test());
	}
}
登入後複製

#輸出:

true
366712642
366712642
false
366712642
1829164700
2018699554
1311053135
false
登入後複製

分析:

①對於引用資料型,此時牽涉到兩塊記憶體的問題, 而且比較的也是記憶體位址是否相同,例如執行語句:

Test t1 = new Test() Test t2 = new Test()時,會開闢兩塊內存,一塊用於儲存t1 t2 ,一塊用於儲存兩個new Test()。而很明顯的是,t1和t2的記憶體位址不一樣,就連兩個new Test()的位址都不一樣,所以此時用==來比較的時候,結果必然是false.

(補充:t1和t2中儲存的其實是new Test() 物件使用的記憶體的首地址。)

②對於String類型來說,內容相同的時候,其記憶體位址也相同,比較的時候看的也是位址。

如果要比較物件中儲存的內容是否相同(不是比較位址),那麼==就無法實現,此時需要equals。

equals的分析

1、先看一個equals比較的例子:

public class TestEquals {
	public static void main(String[] args) {
		
		TestEquals t1 = new TestEquals();
		TestEquals t2 = new TestEquals();
		System.out.println(t1.equals(t2));  //false
		
		String s1 = new String();
		String s2 = new String();		
	
        System.out.println(System.identityHashCode(s1));
		System.out.println(System.identityHashCode(s2));
		System.out.println(System.identityHashCode(new String()));
		System.out.println(System.identityHashCode(new String()));
        System.out.println(s1.equals(s2));  // true
	}
}

输出结果:
false
366712642
1829164700
2018699554
1311053135
true
登入後複製

2、分析:

①t1和t2的比較是false,而s1和s2的比較是true,這裡就牽涉到了equals方法的重寫問題,先看Object類別中equals的源碼:

public boolean equals(Object obj) {
        return (this == obj);
    }
登入後複製

 ② 對於s1.equals(s2) ,this就是s1,obj是s2,而源碼中的比較用的是==,很明顯是引用資料型態的比較,看的是s1和s2的記憶體位址,上面的分析已經知道他們的位址不一樣,所以結果自然就是false.

③而s1和s2的比較結果是true,這是因為在String類別中,equals方法被重寫了,看源碼:

public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            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;
    }
登入後複製

④通過和object中equals原始碼的比較可以看出,String中的equals方法比較的不再是物件的位址,而是看兩個物件內容,或是兩個物件的屬性是否都一樣。

⑤像String,Date,File…等類別都對equals方法進行了重寫。

總結:

1.==用於比較基本資料型別時,比較的是內容是否相等,比較引用資料型別時,看的是記憶體位址是否相等。

2.equals只能比較引用資料型別(物件),沒被重寫之前,使用==來比較記憶體位址,重寫後比較的是物件的具 體內容和屬性是否一致。

更多相關文章教學請造訪:java程式設計入門

#

以上是java中關於==和equals的分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:csdn.net
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!