1. 程式人生 > >“==”和equals()那些事

“==”和equals()那些事

結束 div color 9.png 字符串的比較 再看 引用 圖片 條件

  在最初學習Java時候,經常會看到類似於“==”和equals()的比較這種說法,那時候,不知道在哪裏聽到的說法是,一個比較地址一個比較值。。。,顯然這個說法是極其不嚴謹的,回過頭,重新深入學習才發現了其中貓膩。

  顯而易見,要說最明顯的區別那就是:

  “==”是運算符,“equals()“這是方法,當然這種比較是沒有太大意義的。下面就好好分析一下這兩者的異同吧!

  其實,在Java語言中,並沒有給出關於equals()方法的具體實現,因為該方法是定義在Object類中的,由於java中所有的類都默認繼承於Object,所以所有的類都有這個方法所以他具體的作用是根據具體的業務邏輯來定義的。但也不妨看看它在Object裏面到底是如何定義的:

  技術分享圖片

  沒錯,就只有這三行,很明顯,默認的equals方法實現是與“==”操作一樣的。所以equals具體的作用是由你自己而定的,通過重寫,來定義滿足何種條件了,這個equals返回true,或者返回false。比如在String類中,就重寫了equals方法,先通過“==”判斷是否為一個引用,若“==”返回false,那麽繼續判斷“值”是否相等,若相等,則返回true。源碼如下:

  技術分享圖片

  再看“==”,“==”這是一個二元運算符,常用於比較原生類型,簡單說就是比較值類型,譬如int char之類。也不難理解,equals是方法啊,大多數情況下,對象才能調用方法,int.equals()顯然是不可能的。如果“==”返回true,說明兩個引用指向的地址相同。

  下面通過代碼進一步分析:

  技術分享圖片

  我們可以很清楚的看到:test1.equals(test2)返回true了,因為上面說了String類equals方法的實現規則了,當兩個對象地址不一樣時,比較值,如果值相等,則返回true。故此。test1.equals(test3)也返回true,這是為什麽呢?因為在String類中,有常量池的存在,當new String("abc");結束後,將在棧中定義一個對象test1,並在堆內存中中開辟一塊空間,將內存空間的引用賦值給test1,因為“abc”是字符串常量,所以就會去字符串常量池查看是否有abc字符串對象,沒有的話分配一個空間存放abc,並且將其空間地址存入堆中new出來的空間中。然後到String test3 = "abc";在棧中定義test3,也是去字符串常量池中查找是否有此對象,結果是有的,所以直接把abc的地址賦給test3。這樣看來兩個地址是不一樣的,但引用類型的值是相等的,所以很明顯13行(“==”)輸出false,11行(“equals”)輸出的是true。14行輸出false也是理所當然了,很明顯new了兩個對象,地址是不同的。

總結:

  1. “==”常用來比較原生類型,判斷兩個變量或實例是不是指向同一個內存空間 “equals()”常用來檢測對象的相等性
  2. equals的具體檢測規則,由業務邏輯具體實現。如果沒有重寫equals,那麽和“==”將無異!(常見的比如字符串的比較)

“==”和equals()那些事