說說Java裡的equals(上)

喝水會長肉發表於2021-12-24

在Java字串那些事兒一文發表後,朋友給我留言說:比較字串用equals不就完了唄,幹嘛要用"==",吃飽了撐的,能不能來點實際的。其實在文章裡我是想表明,Java字串兩種宣告方式在堆記憶體中不同的體現,我們在寫程式碼過程中,為了避免重複的建立物件,儘量使用String s1 ="123" 而不是String s1 = new String("123"),因為JVM對前者給做了優化。

那麼,我們今天來說說equels,話不多說,上程式碼:

說說Java裡的equals(上)說說Java裡的equals(上)

執行一下,結果如下:

說說Java裡的equals(上)

面試題中老問"=="與和equals有什麼區別,甚至連百度搜尋equals也會自動關聯出equals和"=="的區別這一類的問題來。

說說Java裡的equals(上)


筆者一直認為,這兩者之間沒有必然的聯絡,在引用型別中,"=="是比較兩個引用是否指向堆記憶體裡的同一個地址(同一個物件),而equals是一個普通的方法,該方法返回的結果依賴於自身的實現。我們先看一下Person這個類,並沒有equals方法呀,那為什麼不報錯呢?在Java中,如果一個類沒有繼承其它類,那麼它預設繼承Object這個類,開啟Object這個類看一下,發現如下程式碼,Person這個類的equals方法就繼承自這裡

說說Java裡的equals(上)

很簡單,就一句程式碼,判斷兩個引用是否指向同一個物件,兩個Person物件在堆記憶體中的表現如下圖所示:

說說Java裡的equals(上)

所以程式碼person1.equals(person2)等同於person1 == person2,當然列印出來的結果是false。我們再來看看Integer這個類, equals的實現如下:

說說Java裡的equals(上)

當程式碼執行到System.out.println(itr.equals(lon))時,會判斷傳入的lon這個物件是否是Integer型別,這裡的lon是Long型別,所以列印出來的結果當然是false了。

最後是我們String的實現

說說Java裡的equals(上)

當程式碼執行到:System.out.println(s3.equals(s4)),由於字串底層char陣列裡存的都是{'1','0','0'}當然列印出來是true了。

注:本專欄所有示例程式碼已上傳至公眾號:saysayJava

如果喜歡本系列文章,請為我點贊或順手分享,您的支援是我繼續下去的動力,您也可以在評論區留言想了解的內容,有機會本專欄會做講解,最後別忘了關注一下我。

轉載無限歡迎,但請註明「作者」和「原文地址」。轉載請在文中保留此段,感謝您對作者版權的尊重。如需商業轉載或刊登,請聯絡作者獲得授權。


上一篇:Java字串那些事兒

下一篇:Java中的陣列


相關文章