說說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是一個普通的方法,該方法返回的結果依賴於自身的實現。//java學習交流:737251827  進入可領取學習資源及對十年開發經驗大佬提問,免費解答!我們先看一下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了。

《為什麼阿里巴巴開發手冊強制不要在 foreach 裡執行刪除操作》




來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70010294/viewspace-2849251/,如需轉載,請註明出處,否則將追究法律責任。

相關文章