從原始碼探究JAVA的equals和==

bluetooth發表於2021-09-09

本文脈絡:先總結出三種應用場景選用equals還是==,再貼java.lang.Object類equals()方法的原始碼,以及重寫了這個方法的派生類有哪些,以String類為例貼一個如何重寫的原始碼。最後附上本文的參考文獻和原始碼連結。

JAVA的equals和==的三種應用情景

  • 基本資料型別比內容用==

  • 引用資料型別比內容用equals

  • 引用資料型別比地址用==

以下做具體解釋。

情景一:基本資料型別比內容用==

說明:如果想比較兩個相同基本資料型別(如兩個都是int型別)的變數值是否相等,則使用==運算子。對於8種基本資料型別的變數,變數直接儲存的是“值”,因此在用關係運算子==來進行比較時,比較的就是 “值” 本身。注意此處不能使用equals方法,因為int是基本型別,不是物件,沒有方法。

注意:要區分int和Integer,int是java提供的8種原始資料型別之一。Java為每個原始型別提供了封裝類,Integer是java為int提供的封裝類。int的預設值為0,而Integer的預設值為null。

8種基本資料型別如下。

  • 整型(四種)byte, short, int, long

  • 浮點型(兩種)float, double

  • 布林型boolean

  • 字元型char

情景二:引用資料型別比內容用equals

說明:如果涉及比較兩個相同或不同引用型別(如兩個都是String型別,或者一個是Integer型別另一個是String型別)的變數值是否相等,即本題情況,則使用equals方法。String、Date、Double、Integer、Long等類對Object類的equals方法進行了重寫,比較的是內容。見本文末尾原始碼。

情景三:引用資料型別比地址用==

前面都是想比較值是否相等,如果我們想比較引用型別的變數所指向的記憶體地址是否相等,則使用==運算子。
說明:==運算子如果作用於引用型別的變數,則比較的是變數所指向的物件的地址。

關於基本資料型別

圖片描述

原始碼

//java.lang.Object.equals(java.lang.Object)原始碼

圖片描述

//derived from above

圖片描述

//java.lang.String.equals(java.lang.Object)原始碼

圖片描述

參考文獻:

1、
2、
3、
4、
5、
6、
7、
8、



作者:心飛麥
連結:
來源:簡書
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。


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

相關文章