== 與equals的主要區(qū)別是 == 常用于比較原生類型,而equals()方法用于檢查對(duì)象的相等性。另一個(gè)不同的點(diǎn)是:如果== 和equals()用于比較對(duì)象,當(dāng)兩個(gè)引用地址相同,== 返回true。而equals()可以返回true或者false主要取決于重寫(xiě)實(shí)現(xiàn)。最常見(jiàn)的一個(gè)例子,字符串的比較,不同情況==和equals()返回不同的結(jié)果。equals()方法最重要的一點(diǎn)是,能夠根據(jù)業(yè)務(wù)要求去重寫(xiě),按照自定義規(guī)則去判斷兩個(gè)對(duì)象是否相等。重寫(xiě)equals()方法的時(shí)候,要注意一下hashCode是否會(huì)因?yàn)閷?duì)象的屬性改變而改變,否則在使用散列集合儲(chǔ)存該對(duì)象的時(shí)候會(huì)碰到坑!!理解equals()方法的存在是很重要的。
- 使用==比較有兩種情況:
比較基礎(chǔ)數(shù)據(jù)類型(Java中基礎(chǔ)數(shù)據(jù)類型包括八中:short,int,long,float,double,char,byte,boolen):這種情況下,==比較的是他們的值是否相等。
引用間的比較:在這種情況下,==比較的是他們?cè)趦?nèi)存中的地址,也就是說(shuō),除非引用指向的是同一個(gè)new出來(lái)的對(duì)象,此時(shí)他們使用 ==去比較得到true,否則,得到false。
- 使用equals進(jìn)行比較:
equals追根溯源,是Object類中的一個(gè)方法,在該類中,equals的實(shí)現(xiàn)也僅僅只是比較兩個(gè)對(duì)象的內(nèi)存地址是否相等,但在一些子類中,如:String、Integer 等,該方法將被重寫(xiě)。
- 以String類為例子說(shuō)明equals與==的區(qū)別
在開(kāi)始這個(gè)例子之前,同學(xué)們需要知道JVM處理String的一些特性。Java的虛擬機(jī)在內(nèi)存中開(kāi)辟出一塊單獨(dú)的區(qū)域,用來(lái)存儲(chǔ)字符串對(duì)象,這塊內(nèi)存區(qū)域被稱為字符串緩沖池。當(dāng)使用 String a = "abc"這樣的語(yǔ)句進(jìn)行定義一個(gè)引用的時(shí)候,首先會(huì)在字符串緩沖池中查找是否已經(jīng)相同的對(duì)象,如果存在,那么就直接將這個(gè)對(duì)象的引用返回給a,如果不存在,則需要新建一個(gè)值為"abc"的對(duì)象,再將新的引用返回a。String a = new String("abc");這樣的語(yǔ)句明確告訴JVM想要產(chǎn)生一個(gè)新的String對(duì)象,并且值為"abc",于是就在堆內(nèi)存中的某一個(gè)小角落開(kāi)辟了一個(gè)新的String對(duì)象。
-
==
在比較引用的情況下,會(huì)去比較兩個(gè)引用的內(nèi)存地址是否相等。
String str1 = "abc";
String str2 = "abc";
System.out.println(str1 == str2);
System.out.println(str1.equals(str2));
String str2 = new String("abc");
System.out.println(str1 == str2);
System.out.println(str1.equals(str2));
以上代碼將會(huì)輸出
true
true
false
true
**第一個(gè)true:**因?yàn)樵趕tr2賦值之前,str1的賦值操作就已經(jīng)在內(nèi)存中創(chuàng)建了一個(gè)值為"abc"的對(duì)象了,然后str2將會(huì)與str1指向相同的地址。
**第二個(gè)true:**因?yàn)閌String`已經(jīng)重寫(xiě)了`equals`方法:為了方便大家閱讀我貼出來(lái),并且在注釋用進(jìn)行分析:
public boolean equals(Object anObject) {
//如果比較的對(duì)象與自身內(nèi)存地址相等的話
//就說(shuō)明他兩指向的是同一個(gè)對(duì)象
//所以此時(shí)equals的返回值跟==的結(jié)果是一樣的。
if (this == anObject) {
return true;
}
//當(dāng)比較的對(duì)象與自身的內(nèi)存地址不相等,并且
//比較的對(duì)象是String類型的時(shí)候
//將會(huì)執(zhí)行這個(gè)分支
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;
//在這里循環(huán)遍歷兩個(gè)String中的char
while (n-- != 0) {
//只要有一個(gè)不相等,那么就會(huì)返回false
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
進(jìn)行以上分析之后,就不難理解第一段代碼中的實(shí)例程序輸出了。
總結(jié):
- 使用 == 比較原生類型如:boolean、int、char等等,使用equals()比較對(duì)象。
- == 返回true如果兩個(gè)引用指向相同的對(duì)象,equals()的返回結(jié)果依賴于具體業(yè)務(wù)實(shí)現(xiàn)
- 字符串的對(duì)比使用equals()代替 == 操作符
以上就是關(guān)于equals方法和==操作符的區(qū)別,其主要的不同是一個(gè)是操作符,一個(gè)是方法,==用于對(duì)比原生類型而equals()方法比較對(duì)象的相等性。