前言
當(dāng)《阿里巴巴Java開發(fā)手冊(cè)》發(fā)布后,我也是仔細(xì)進(jìn)行了閱讀,想從中找出一些“標(biāo)準(zhǔn)”,讓自己的代碼質(zhì)量提高。手冊(cè)中對(duì) Object
的 equals
方法的使用進(jìn)行了強(qiáng)制,而且推薦使用 JDK7 中工具類 Objects
的 equals
方法,至此之后我就很少使用 Object.equals()
方法了。
一、Java開發(fā)手冊(cè)說明
在第一章:編程規(guī)約 -> 第四節(jié):OOP規(guī)約 -> 第6條內(nèi)容如下圖:
這里說 Object.equals()
方法容易拋空指針異常,空指針異常相信大家并不陌生,應(yīng)該使用確定有值的對(duì)象來調(diào)用 equals()
方法,不能無中生有,不能從 null
調(diào)用方法,還舉了正例與反例。最后推薦使用 Objects.equals()
方法。
二、Object.equals()方法
Object.equals()
方法是 Java 語言中的一個(gè)基礎(chǔ)方法,用來比較兩個(gè)對(duì)象是否相等。以下是它的源代碼實(shí)現(xiàn):
public boolean equals(Object obj) {
return (this == obj);
}
這個(gè)方法的實(shí)現(xiàn)非常簡(jiǎn)單,它首先用引用比較來檢查傳遞給它的參數(shù)對(duì)象是否是當(dāng)前對(duì)象本身,如果是,則返回 true
,表示兩個(gè)對(duì)象相等。否則,它返回 false
,表示兩個(gè)對(duì)象不相等。
我們需要注意的是,Object
的 equals()
方法是根據(jù)對(duì)象的引用來判斷兩個(gè)對(duì)象是否相等的,而不是根據(jù)對(duì)象的內(nèi)容。如果我們要比較兩個(gè)對(duì)象的內(nèi)容是否相等,我們需要重寫 equals()
方法,這樣就可以根據(jù)對(duì)象的具體內(nèi)容來判斷它們是否相等了。
比如 Java 中的字符串類 String
就是通過重寫 equals()
方法來實(shí)現(xiàn)字符串內(nèi)容的比較的。例如,以下代碼比較兩個(gè)字符串的內(nèi)容是否相等:
String str1 = new String("你好");
String str2 = new String("你好");
// 比較兩個(gè)字符串的內(nèi)容是否相等
if(str1.equals(str2)) {
System.out.println("這兩個(gè)字符串內(nèi)容相等。");
}
else {
System.out.println("這兩個(gè)字符串內(nèi)容不相等");
}
執(zhí)行結(jié)果為:
這兩個(gè)字符串內(nèi)容相等。
三、Objects.equals()方法
Java 中的 Objects.equals()
方法實(shí)際上是由 Java 中的 Objects
類提供的靜態(tài)方法,以下是它的源代碼:
public static boolean equals(Object a, Object b) {
return (a == b) || (a != null && a.equals(b));
}
這個(gè)方法的實(shí)現(xiàn)非常簡(jiǎn)潔,它首先通過引用比較來檢查傳遞給它的兩個(gè)對(duì)象是否相同。如果相同,它直接返回 true
。否則,它進(jìn)一步檢查第一個(gè)參數(shù)是否為 null
,如果為 null
,則返回 false
。否則,它調(diào)用第一個(gè)參數(shù)的 equals()
方法來比較兩個(gè)對(duì)象的內(nèi)容是否相同。
我們需要注意的是,這個(gè)方法中使用的是邏輯或運(yùn)算符(||
)。首先檢查第一個(gè)條件是否為 true
,只有當(dāng)?shù)谝粋€(gè)條件為 false
時(shí)才會(huì)執(zhí)行第二個(gè)條件。這種方式在 Java 中有時(shí)被稱為 "short-circuiting"。這里也就是短路或,這種技巧可以用來提高代碼的效率,避免執(zhí)行不必要的操作。
Objects.equals()
方法是 Java 中用于比較兩個(gè)對(duì)象是否相等的一個(gè)實(shí)用工具方法,它可以處理對(duì)象為 null
的情況,避免了因?qū)ο鬄?null
而產(chǎn)生 NullPointerException
的問題。具體來說,如果兩個(gè)參數(shù)都是 null
,則返回 true
;如果一個(gè)參數(shù)是 null
而另一個(gè)不是 null
,則返回 false
;否則,調(diào)用第一個(gè)參數(shù)的 equals
方法進(jìn)行比較。這樣就避免了空指針異常了。
四、Objects.equals()和Object.equals()
Java 中的 Objects.equals()
和 Object.equals()
方法都用于比較兩個(gè)對(duì)象是否相等,但是它們之間還是有一些差異的。
-
對(duì)比
null
值:Objects.equals()
方法可以比較null
值,而Object.equals()
方法不能比較null
值,如果比較null
值,將會(huì)拋出NullPointerException
。 -
實(shí)現(xiàn)原理:
Objects.equals()
方法內(nèi)部調(diào)用的是第一個(gè)對(duì)象的equals()
方法進(jìn)行比較,如果第一個(gè)對(duì)象為null
,則直接返回與第二個(gè)對(duì)象比較的結(jié)果。而Object.equals()
方法直接比較兩個(gè)對(duì)象的引用是否相同。 -
參數(shù)類型:
Objects.equals()
方法的兩個(gè)參數(shù)可以是任意類型,而Object.equals()
方法的參數(shù)必須是Object
類型。
總結(jié)
建議使用 JDK7 中工具類 Objects
的 equals
方法。文章來源:http://www.zghlxwxcb.cn/news/detail-473351.html
關(guān)注公眾號(hào):編程火箭車
我們定期發(fā)布編程相關(guān)的文章、資訊、活動(dòng)等內(nèi)容。幫助編程愛好者、初學(xué)者或初級(jí)程序員快速入門、打牢基礎(chǔ)。歡迎大家關(guān)注,和我們一起探索編程的精彩世界。文章來源地址http://www.zghlxwxcb.cn/news/detail-473351.html
到了這里,關(guān)于你還在用Object.equals()方法嗎?的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!