在比較兩個(gè)對(duì)象或者數(shù)據(jù)大小的時(shí)候,經(jīng)常會(huì)用到==、compareTo()和equals(),尤其是在接入了Comparable接口后重寫(xiě)compareTo方法等場(chǎng)景,所以我們來(lái)理一下這三個(gè)的區(qū)別。
目前創(chuàng)新互聯(lián)公司已為近1000家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)絡(luò)空間、綿陽(yáng)服務(wù)器托管、企業(yè)網(wǎng)站設(shè)計(jì)、東山網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶(hù)導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶(hù)和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。
1.等號(hào)"==":
等號(hào)是最簡(jiǎn)單也最容易理解的,如果等號(hào)的兩邊是基本數(shù)據(jù)類(lèi)型,比如int,double,那么等號(hào)就用來(lái)單純的比較他們的數(shù)值大小
如果等號(hào)兩邊放的是兩個(gè)對(duì)象,那么就會(huì)比較他們?cè)趦?nèi)存當(dāng)中的地址。
例如:
String a="abc";
String b="abc";
System.out.println(a==b);
答案是:true
因?yàn)橄嗤淖址畠?nèi)容,在地址上是一樣。在Java中,String是有一個(gè)String pool的,里面存放了可以共享的字符串對(duì)象,在聲明一個(gè)String對(duì)象后,會(huì)首先去找是否存在相同的String內(nèi)容,如果有的話(huà)是不會(huì)創(chuàng)建新的對(duì)象的。在這里b實(shí)際上是引用了a的對(duì)象的值,他自己并沒(méi)有創(chuàng)建對(duì)象,所以這里的答案是true。
但是如果我們接著
String c=new String(“abc”);
再
System.out.println(a==c);
那答案就是false,因?yàn)檫@二者的地址并不是一致的。
2.compareTo()
在Java里觀察compareTo()的源碼
public int compareTo(String anotherString) {
int len1 = value.length;
int len2 = anotherString.value.length;
int lim = Math.min(len1, len2);
char v1[] = value;
char v2[] = anotherString.value;
int k = 0;
while (k < lim) {
char c1 = v1[k];
char c2 = v2[k];
if (c1 != c2) {
return c1 - c2;
}
k++;
}
return len1 - len2;
}
可以觀察出,這里實(shí)際上是獲取的字符串(也可以是其他對(duì)象)的長(zhǎng)度,然后作減法,這里的減法就是ASCII碼的減法,所以compareTo()會(huì)返回?cái)?shù)字,如果兩個(gè)字符串內(nèi)容相同,會(huì)返回0,字符串a(chǎn)大于字符串b,會(huì)返回相差的ASCII碼的正數(shù),字符串a(chǎn)小于字符串b,會(huì)返回相差的ASCII碼的負(fù)數(shù)。
所以 System.out.println(a.compareTo(b))的答案是:0
3.equals()
依舊是來(lái)觀察Java中equals()的源碼
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}無(wú)錫知名的婦科醫(yī)院 http://www.wxbhnkyy39.com/
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;
}
可以觀察出,equals是先用等號(hào)(==)直接來(lái)比較兩個(gè)對(duì)象在內(nèi)存當(dāng)中的地址,如果相等會(huì)直接返回true,如果這兩個(gè)對(duì)象的地址不一樣,就會(huì)考慮這兩個(gè)對(duì)象是不是String類(lèi)型的,如果是String類(lèi)型的,那先比較兩個(gè)字符串長(zhǎng)度是否一樣,如果長(zhǎng)度不一致,那100%不相等,直接返回false。長(zhǎng)度一致則逐個(gè)比較
4.compareTo()和equals的區(qū)別
compareTo()會(huì)返回二者的差值,即返回的是一個(gè)數(shù)字;而equals就簡(jiǎn)單一些,只返回true或者false。
最后,compareTo()和equals()都可以判斷其他基本數(shù)據(jù)類(lèi)型,比如說(shuō)Integer,Java的源碼中對(duì)這兩者方法都做了一些重載,可以根據(jù)參數(shù)的類(lèi)型去自動(dòng)匹配相應(yīng)的方法,他們的原理也非常簡(jiǎn)單,只是一些簡(jiǎn)單的減法或者(?:)這類(lèi)判斷。