面試題大揭秘!Java中== 與equals的區(qū)別?

大家好,我是你們的小米!今天我們要來聊一個(gè)在Java面試中經(jīng)常被問到的問題:== 與 equals 的區(qū)別。這可是一個(gè)重要而且常常令人頭疼的問題哦!廢話不多說,咱們馬上開啟今天的探索之旅吧!
背景知識(shí)
在開始深入探討 == 和 equals 的區(qū)別之前,先讓我們復(fù)習(xí)一下一些相關(guān)的背景知識(shí)。
== 運(yùn)算符:在Java中,== 運(yùn)算符用于比較兩個(gè)對(duì)象的引用是否相等,即它們是否指向內(nèi)存中的同一個(gè)對(duì)象。
equals 方法:equals 是一個(gè)定義在 java.lang.Object 類中的方法,用于比較兩個(gè)對(duì)象的內(nèi)容是否相等。子類可以重寫這個(gè)方法,以實(shí)現(xiàn)自定義的相等比較邏輯。
引用比較 vs 內(nèi)容比較
首先,我們來看一下 == 和 equals 的最大區(qū)別:它們進(jìn)行的比較方式不同。
== 比較的是兩個(gè)對(duì)象的引用,也就是它們?cè)趦?nèi)存中的地址是否相同。如果兩個(gè)對(duì)象的引用相同,那么 == 返回 true,否則返回 false。
equals 比較的是兩個(gè)對(duì)象的內(nèi)容。換句話說,就是通過調(diào)用對(duì)象的 equals 方法,自定義的邏輯來判斷兩個(gè)對(duì)象是否相等。默認(rèn)情況下,equals 方法和 == 運(yùn)算符的效果是一樣的,都是比較引用。
重寫equals的意義
你可能會(huì)問,既然默認(rèn)情況下 equals 和 == 都是比較引用,那為什么還需要重寫 equals 方法呢?
這是個(gè)好問題!Java中的很多類,比如 String、Integer 等,都已經(jīng)重寫了 equals 方法,使其能夠進(jìn)行內(nèi)容比較。這就是為什么我們可以這樣做:

如果沒有重寫 equals,上述代碼塊是不會(huì)被執(zhí)行的,因?yàn)槟J(rèn)情況下 equals 比較的是引用。
示例
為了更好地理解這兩者的區(qū)別,我們舉個(gè)實(shí)例來說明。

在這個(gè)例子中,我們定義了一個(gè) Person 類,重寫了 equals 方法,用于比較兩個(gè) Person 對(duì)象的 name 字段是否相等。接下來我們來看幾個(gè)例子:

從輸出結(jié)果中可以看出,== 對(duì)于 person1 和 person2 來說返回 false,因?yàn)樗鼈兪遣煌膶?duì)象。而 equals 則返回 true,因?yàn)槲覀冎貙懥?equals 方法來比較內(nèi)容。
END
在本篇文章中,我們深入探討了 == 和 equals 在Java中的區(qū)別。我們了解到,== 是用于引用比較,而 equals 是用于內(nèi)容比較。同時(shí),我們也明白了重寫 equals 方法的重要性,以便能夠?qū)崿F(xiàn)自定義的相等比較邏輯。
希望通過本文的解析,大家能夠更加清楚地理解 == 和 equals 在Java中的作用和區(qū)別。在面試中,如果被問到這個(gè)問題,你也能從容地回答出來啦!
如果你喜歡這篇文章,記得點(diǎn)贊、評(píng)論和分享哦!如果有任何疑問或建議,也歡迎在評(píng)論區(qū)留言,我會(huì)及時(shí)回復(fù)的。感謝大家的支持,我們下期見!
如有疑問或者更多的技術(shù)分享,歡迎關(guān)注我的微信公眾號(hào)“知其然亦知其所以然”!
