溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

java中==和equals的使用方法

發(fā)布時(shí)間:2020-06-23 15:06:18 來(lái)源:億速云 閱讀:120 作者:元一 欄目:編程語(yǔ)言

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)java中==和equals的使用方法,以專(zhuān)業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

equals的分析

1、先看一個(gè)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
	}
}

輸出結(jié)果:
false
366712642
1829164700
2018699554
1311053135
true

2、分析:

①t1和t2的比較是false,而s1和s2的比較是true,這里就涉及到了equals方法的重寫(xiě)問(wèn)題,先看 Object類(lèi) 中equals的源碼:

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

② 對(duì)于s1.equals(s2) ,this就是s1,obj是s2,而源碼中的比較用的是==,很明顯是引用數(shù)據(jù)類(lèi)型的比 較,看的是s1和s2的內(nèi)存地址,上面的分析已經(jīng)知道他們的地址不一樣,所以結(jié)果自然就是false.

③而s1和s2的比較結(jié)果是true,這是因?yàn)樵赟tring類(lèi)中,equals方法被重寫(xiě)了,看源碼:

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;
    }

④通過(guò)和object中equals源碼的對(duì)比可以看出,String中的equals方法比較的不再是對(duì)象的地址,而是看 兩個(gè)對(duì)象內(nèi)容,或者兩個(gè)對(duì)象的屬性是否都一樣。

⑤像String,Date,F(xiàn)ile…等類(lèi)都對(duì)equals方法進(jìn)行了重寫(xiě)。

1、對(duì)于基本數(shù)據(jù)類(lèi)型,比較的是他們的具體內(nèi)容是不是一樣,跟他們的內(nèi)存地址無(wú)關(guān)。

舉個(gè)例子:

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);  很明顯,布爾型不能和其他基本數(shù)據(jù)類(lèi)型比較,編譯報(bào)錯(cuò).
		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

==分析:

①根據(jù)比較的結(jié)果和內(nèi)存地址來(lái)看,內(nèi)容一樣,內(nèi)存地址不一樣,但是返回的結(jié)果都是true,說(shuō)明比較的 時(shí)候只看變量中存儲(chǔ)的內(nèi)容是否相同,而跟內(nèi)存地址無(wú)關(guān)。

②==比較的兩邊數(shù)據(jù)需要能強(qiáng)制轉(zhuǎn)換成同一類(lèi)型,比如int和double的比較,會(huì)強(qiáng)制轉(zhuǎn)換到double。

③布爾類(lèi)型不能和int,float,double,char等基本數(shù)據(jù)類(lèi)型做比較,編譯時(shí)就報(bào)錯(cuò)。

2、對(duì)于引用數(shù)據(jù)類(lèi)型的比較:

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

分析:

①對(duì)于引用數(shù)據(jù)類(lèi)型,此時(shí)涉及到兩塊內(nèi)存的問(wèn)題, 而且比較的也是內(nèi)存地址是否相同,比如執(zhí)行語(yǔ)句:

Test t1 = new Test() Test t2 = new Test()時(shí),會(huì)開(kāi)辟兩塊內(nèi)存,一塊用于儲(chǔ)存t1 t2 ,一 塊用于儲(chǔ)存兩個(gè) new Test()。而很明顯的是,t1和t2的內(nèi)存地址不一樣,就連兩個(gè)new Test()的地 址都不一樣,所以此時(shí)用==來(lái)比較的時(shí)候,結(jié)果必然是false.

(補(bǔ)充:t1和t2中存儲(chǔ)的其實(shí)是new Test() 對(duì)象使用的內(nèi)存的首地址。)

②對(duì)于String類(lèi)型來(lái)說(shuō),內(nèi)容相同的時(shí)候,其內(nèi)存地址也相同,比較的時(shí)候看的也是地址。

如果要比較對(duì)象中存儲(chǔ)的內(nèi)容是否相同(不是比較地址),那么==就無(wú)法實(shí)現(xiàn),此時(shí)需要equals。

總結(jié):

1.==用于比較基本數(shù)據(jù)類(lèi)型時(shí),比較的是內(nèi)容是否相等,比較引用數(shù)據(jù)類(lèi)型時(shí),看的是內(nèi)存地址是否相等。

2.equals只能比較引用數(shù)據(jù)類(lèi)型(對(duì)象),沒(méi)被重寫(xiě)之前,使用==來(lái)比較內(nèi)存地址,重寫(xiě)后比較的是對(duì)象的具 體內(nèi)容和屬性是否一致。

上述就是小編為大家分享的java中==和equals的使用方法了,如果您也有類(lèi)似的疑惑,不妨參照上述方法進(jìn)行嘗試。如果想了解更多相關(guān)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI