Java中equals 與 ==

在Java學習和麪試中經常遇到這個問題,雖然想着簡單,但還是決定記錄下來,畢竟菜嘛…

==:

   == 是直接比較的兩個對象的堆內存地址,如果相等,則說明這兩個引用實際是指向同一個對象地址的。

但是我們又常常碰到這樣一個問題

最終結果是true,true,true

那既然==是比較的地址,那麼int數據的地址是怎樣的呢,String又是怎樣的呢?

   對於基本數據類型(byte,short,char,int,float,double,long,boolean)來說,他們是作爲常量在方法區中的常量池裏面以HashSet策略存儲起來的,對於這樣的字符串 “123” 也是相同的道理,在常量池中,一個常量只會對應一個地址,因此不管是再多的 123,“123” 這樣的數據都只會存儲一個地址,所以所有他們的引用都是指向的同一塊地址,因此基本數據類型和String常量是可以直接通過==來直接比較的。
   另外,對於基本數據的包裝類型(Byte, Short, Character,Integer,Float, Double,Long, Boolean)除了Float和Double之外,其他的六種都是實現了常量池的,因此對於這些數據類型而言,一般我們也可以直接通過==來判斷是否相等。

那麼再出一個問題考考大家 ↓

猜猜看,結果是啥?。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

   結果是true,false。沒想到吧!其實是因爲 Integer 在常量池中的存儲範圍爲[-128,127],127在這範圍內,因此是直接存儲於常量池的,而128不在這範圍內,所以會在堆內存中創建一個新的對象來保存這個值,所以m,n分別指向了兩個不同的對象地址,故而導致了不相等。

equals方法:

   之前在網上也搜了很多相關的問題,但給出的答案卻不盡人意,很多網友都說equals比較的是對象的內容,這樣的說法是不準確的。首先我們來看看在Object類中定義的equals方法 ↓

  • 可以看到,在Object類型的equals方法是直接通過==來比較的,和==是沒有任何區別的。

  • 那麼爲什麼又要說equlas和==的區別呢?是因爲equals方法是可以由我們自己重寫的。

衆所周知,我們所有的類都直接或間接地繼承自java.lang.Object類,因此我們可以通過重寫equals方法來實現我們自己想要的比較方法。來看看eclipse爲我們自動生成的equals方法 ↓

   可以看出,eclipse還是很智能的,它首先是判斷兩個對象的地址是否相等,若不相等再進行下面的成員變量判斷。

   但這個方法體是完全可以由我們自己實現的,即便是我們直接 return true 都是可以的,只要能滿足我們的業務需求,怎樣寫都是無所謂的,因此,equals比較的並不一定是對象的內容,它還可以由其他的信息來指導比較。

文中不當之處歡迎大佬們指教或提出異議。

轉載自 : https://blog.csdn.net/lcsy000/article/details/82782864

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章