您好,登錄后才能下訂單哦!
這期內(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è)資訊。
免責(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)容。