本文采用總分總的小學(xué)生寫作手法較為深入地探究了“==”與“equals()”的區(qū)別 :-)
概括
用途:equals()和“==”操作用于對象的比較,檢查倆對象的相等性。
性質(zhì):前者是方法,后者是操作符。
-
區(qū)別:
==是判斷兩個(gè)變量或?qū)嵗遣皇侵赶蛲粋€(gè)內(nèi)存空間
equals()是判斷兩個(gè)變量或?qū)嵗赶虻膬?nèi)存空間的值是不是相同==是指對內(nèi)存地址進(jìn)行比較
equals()是對字符串的內(nèi)容進(jìn)行比較==指引用是否相同
equals()指的是值是否相同
通俗來說,如何記住區(qū)別?(不嚴(yán)謹(jǐn)?shù)恼f法)
==:等于。
equals:相同。
“==”是什么?
是什么?
“==”或等號操作在Java編程語言中是一個(gè)二元操作符,用于比較原生類型和對象。就原生類型如boolean、int、float來說,使用“==”來比較兩者,這個(gè)很好掌握,比如1=1。但是在比較對象的時(shí)候,就會與equals()造成困惑。原理:
“==”對比兩個(gè)對象基于內(nèi)存引用,如果兩個(gè)對象的引用完全相同(指向同一個(gè)對象)時(shí),“==”操作將返回true,否則返回false。-
編程示例:
class AnotherClass{} public class EqualsTest { public static void main(String[] args) { //基本數(shù)據(jù)類型:int、float、double、boolean、char等 char ch1 = 'a'; char ch2 = 'a'; System.out.println("char比較結(jié)果:" + (ch1==ch2)); int i1 = 100; int i2 = 100; System.out.println("int比較結(jié)果:" + (i1==i2)); //字符串?dāng)?shù)據(jù)類型 String str1 = new String("liaoshaoshao"); String str2 = new String("liaoshaoshao"); String str3 = str2; System.out.println("兩個(gè)new出來的字符串比較結(jié)果:" + (str1==str2)); System.out.println("賦值出來的字符串比較結(jié)果:" + (str3==str2)); //對象 AnotherClass ac1 = new AnotherClass(); AnotherClass ac2 = new AnotherClass(); AnotherClass ac3 = ac2; System.out.println("兩個(gè)new出來的對象比較結(jié)果:" + (ac1==ac2)); System.out.println("賦值出來的對象比較結(jié)果:" + (ac3==ac2)); } }
控制臺輸出:
char比較結(jié)果:true
int比較結(jié)果:true
兩個(gè)new出來的字符串比較結(jié)果:false
賦值出來的字符串比較結(jié)果:true
兩個(gè)new出來的對象比較結(jié)果:false
賦值出來的對象比較結(jié)果:true
"equals()"是什么?
是什么?
equals()方法定義在Object類里面,根據(jù)具體的業(yè)務(wù)邏輯來定義該方法,用于檢查兩個(gè)對象的相等性。實(shí)際用途:
Java 語言里的 equals方法其實(shí)是交給開發(fā)者去覆寫的,讓開發(fā)者自己去定義滿足什么條件的兩個(gè)Object是equal的。-
在默認(rèn)情況下(即該類默認(rèn)繼承Object類),equals()和==是一樣的,除非被覆寫(override)了。
因?yàn)樵贠bject類中有equals(),其代碼如下:
public boolean equals(Object obj) {
return (this == obj);
}
可以看出,如果不覆寫,那么equals()與==沒什么區(qū)別。引申閱讀:
官方API文檔中關(guān)于Object類的equals()的解釋:
public boolean equals(Object obj)指示其他某個(gè)對象是否與此對象“相等”。
equals 方法在非空對象引用上實(shí)現(xiàn)相等關(guān)系:
- 自反性:對于任何非空引用值 x,x.equals(x) 都應(yīng)返回 true。
- 對稱性:對于任何非空引用值 x 和 y,當(dāng)且僅當(dāng) y.equals(x) 返回 true 時(shí),x.equals(y) 才應(yīng)返回 true。
- 傳遞性:對于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 應(yīng)返回 true。
- 一致性:對于任何非空引用值 x 和 y,多次調(diào)用 x.equals(y) 始終返回 true 或始終返回 false,前提是對象上 equals 比較中所用的信息沒有被修改。
- 對于任何非空引用值 x,x.equals(null) 都應(yīng)返回 false。
Object 類的 equals 方法實(shí)現(xiàn)對象上差別可能性最大的相等關(guān)系;即,對于任何非空引用值 x 和 y,當(dāng)且僅當(dāng) x 和 y 引用同一個(gè)對象時(shí),此方法才返回 true(x == y 具有值 true)。
- 注意:當(dāng)此方法被重寫時(shí),通常有必要重寫 hashCode 方法,以維護(hù) hashCode 方法的常規(guī)協(xié)定,該協(xié)定聲明相等對象必須具有相等的哈希碼。 -
假設(shè)該類覆寫了equals(),那么就按照開發(fā)者自己想要的邏輯來判斷。最典型的例子當(dāng)屬String類,String類中已經(jīng)覆寫了equals(),源碼如下:
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;
}
個(gè)人見解:- String類的equals()方法調(diào)用后,首先會比較這兩個(gè)String類的對象(即兩個(gè)字符串)的地址是否相等,若相等,那當(dāng)然“equals”,返回true。
- anObject即為傳入的參數(shù),首先得確定它是String類的對象,所以用instanceof來判斷,如果連String類型都不是,那只執(zhí)行最后的
return false
。滿足條件后,強(qiáng)制轉(zhuǎn)換為String類型。 - value.length是自對象的字符串長度。
- 兩個(gè)字符串長度相等,才能繼續(xù)比較,長度不等,則返回false。
- 接下來就是依次比較兩個(gè)字符串中字符是否相等,若出現(xiàn)了不相等的字符,直接返回false,如果一直到比較完了都沒有出現(xiàn)不相等的字符,則返回true
- 結(jié)論:String類中的equals方法用來比較兩個(gè)字符串內(nèi)容是否相等。(當(dāng)然,地址相等,那么內(nèi)容肯定也是相等的)
總結(jié):
對于值變量(int、float、double、char等),用“==”來判斷相等性。
對于String,用“==”來判斷字符串地址是否相等,用“equals()”來判斷字符串內(nèi)容是否相等。
對于引用對象,用“==”來判斷對象地址是否相等,經(jīng)常覆寫equals方法,讓開發(fā)者自己去定義滿足什么條件的兩個(gè)Object是equal的。
學(xué)生一枚,難免有錯(cuò)誤之處,請各位大神斧正。