深入理解== 和 equals 的本質區別
- 簡介
- 區別:
- 圖解:
- 注意點:
- 源碼分析:
- 總結
- 分享一波:程序員賺外快-必看的巔峰干貨
簡介
初學者常常被"= =“和‘equals ’所折磨,為什么,因為他們的大概意思相同,都是比較兩個對象是否相等,而又不搞不清他們的具體比較兩個對象相等的原理是什么,所以經常搞混淆,接下來我們就去仔細的剖析他們,真正理解什么時候用”= =",什么時候用equals
先統一看一下他們兩個的區別,知道區別后再仔細研究他們的原理
區別:
==:它存在兩個情況
1.當他比較兩個基本類型時,判斷的時兩個基本類型的類型和值是否相同
2.當他比較兩個引用類型是,判斷的時兩個引用類型的類型和地址是否相同
圖解:
equels:最基本的equels方法其實就是= =,也就是說,最基本的equels也存在兩個情況
1.當他比較兩個基本類型時,判斷的時兩個基本類型的類型和值是否相同
2.當他比較兩個引用類型是,判斷的時兩個引用類型的類型和地址是否相同
也就是說最基本的equels方法和= =完全一樣
注意點:
請看清楚,我這里說的最基本的equels方法,什么是最基本的equels方法?
在這里我們要知道一個知識點:equels方法是Object類的方法,我們再代碼中寫的所有Class類都繼承了Object的equels方法,所以我稱Object類的equels方法是最基本的equels方法
源碼分析:
我們再來看一下Object類的equels方法的源碼
這下明白了吧!Object類的equels方法是直接點用了‘= =’,所以一開始我說:最基本的equels方法和==完全一樣
那我們知道,繼承的一大特點就是實現了java語言的多樣性,而方法重寫則是java語言多樣性的實現原理之一。問題的重要點就在這里,繼承Object類的子類對equels的重寫導致了equels和= =的不同。具體哪里不同,這就要看怎么重寫了。
給大家看一下一個重寫了的,比如String,看圖:
String的重寫equals方法流程是這樣的
第一步:判斷引用地址是否相等,引用地址相等說明他們是同一個對象,說明值肯定相同,返回true
第二部:判斷對象類型是否相同,類型不同,直接返回false
第三步:循環兩個對象的字符,一一對比是否相同,都相同說明值相同,返回true
所以String重寫的equals方法的總目的就是判斷兩個對象的值是否相同。
總結
所以總結下來就是說,==和我們日常用的equals方法哪里不一樣,我們要去看他們怎么重寫的equals方法,看完之后才能知道equals具體是怎么比較的。