== 與equals的主要區(qū)別是 == 常用于比較原生類型牧氮,而equals()方法用于檢查對象的相等性区宇。另一個不同的點是:如果== 和equals()用于比較對象邪乍,當(dāng)兩個引用地址相同捅伤,== 返回true。而equals()可以返回true或者false主要取決于重寫實現(xiàn)难衰。最常見的一個例子股毫,字符串的比較,不同情況==和equals()返回不同的結(jié)果召衔。equals()方法最重要的一點是铃诬,能夠根據(jù)業(yè)務(wù)要求去重寫,按照自定義規(guī)則去判斷兩個對象是否相等苍凛。重寫equals()方法的時候趣席,要注意一下hashCode是否會因為對象的屬性改變而改變,否則在使用散列集合儲存該對象的時候會碰到坑4己宣肚!理解equals()方法的存在是很重要的。
- 使用==比較有兩種情況:
比較基礎(chǔ)數(shù)據(jù)類型(Java中基礎(chǔ)數(shù)據(jù)類型包括八中:short,int,long,float,double,char,byte,boolen):這種情況下悠栓,==比較的是他們的值是否相等霉涨。
引用間的比較:在這種情況下,==比較的是他們在內(nèi)存中的地址惭适,也就是說笙瑟,除非引用指向的是同一個new出來的對象,此時他們使用 ==去比較得到true癞志,否則往枷,得到false。
- 使用equals進(jìn)行比較:
equals追根溯源凄杯,是Object類中的一個方法错洁,在該類中,equals的實現(xiàn)也僅僅只是比較兩個對象的內(nèi)存地址是否相等戒突,但在一些子類中屯碴,如:String、Integer 等膊存,該方法將被重寫导而。
- 以String類為例子說明equals與==的區(qū)別
在開始這個例子之前,同學(xué)們需要知道JVM處理String的一些特性膝舅。Java的虛擬機在內(nèi)存中開辟出一塊單獨的區(qū)域嗡载,用來存儲字符串對象,這塊內(nèi)存區(qū)域被稱為字符串緩沖池仍稀。當(dāng)使用 String a = "abc"這樣的語句進(jìn)行定義一個引用的時候,首先會在字符串緩沖池中查找是否已經(jīng)相同的對象埂息,如果存在技潘,那么就直接將這個對象的引用返回給a遥巴,如果不存在,則需要新建一個值為"abc"的對象享幽,再將新的引用返回a铲掐。String a = new String("abc");這樣的語句明確告訴JVM想要產(chǎn)生一個新的String對象,并且值為"abc"值桩,于是就在堆內(nèi)存中的某一個小角落開辟了一個新的String對象摆霉。
-
==
在比較引用的情況下,會去比較兩個引用的內(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));
以上代碼將會輸出
true
true
false
true
**第一個true:**因為在str2賦值之前携栋,str1的賦值操作就已經(jīng)在內(nèi)存中創(chuàng)建了一個值為"abc"的對象了,然后str2將會與str1指向相同的地址咳秉。
**第二個true:**因為`String`已經(jīng)重寫了`equals`方法:為了方便大家閱讀我貼出來婉支,并且在注釋用進(jìn)行分析:
public boolean equals(Object anObject) {
//如果比較的對象與自身內(nèi)存地址相等的話
//就說明他兩指向的是同一個對象
//所以此時equals的返回值跟==的結(jié)果是一樣的。
if (this == anObject) {
return true;
}
//當(dāng)比較的對象與自身的內(nèi)存地址不相等澜建,并且
//比較的對象是String類型的時候
//將會執(zhí)行這個分支
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)遍歷兩個String中的char
while (n-- != 0) {
//只要有一個不相等向挖,那么就會返回false
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
進(jìn)行以上分析之后,就不難理解第一段代碼中的實例程序輸出了炕舵。
總結(jié):
- 使用 == 比較原生類型如:boolean何之、int、char等等咽筋,使用equals()比較對象帝美。
- == 返回true如果兩個引用指向相同的對象,equals()的返回結(jié)果依賴于具體業(yè)務(wù)實現(xiàn)
- 字符串的對比使用equals()代替 == 操作符
以上就是關(guān)于equals方法和==操作符的區(qū)別晤硕,其主要的不同是一個是操作符悼潭,一個是方法,==用于對比原生類型而equals()方法比較對象的相等性舞箍。