您好,登錄后才能下訂單哦!
這篇文章主要介紹“Java中的equals()、==和hashCode()的用法區別”,在日常操作中,相信很多人在Java中的equals()、==和hashCode()的用法區別問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Java中的equals()、==和hashCode()的用法區別”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
equals()
equals() 的作用是用來判斷兩個對象是否相等。它定義在 JDK 的 Object 類中。源碼如下:
由于 Object 類是所有類基類,所以所有的 Java 類都有 equals() 方法。只不過默認的 equals() 方法,等價于 ==。Object 類中的 equals() 方法默認是通過判斷兩個對象的地址是否相等(即,是否是同一個對象)來區分它們是否相等的。
因此,我們通常會重寫 equals() 方法。若某個類沒有覆蓋 equals() 方法,當通過它的 equals() 比較兩個對象時,實際上是比較兩個對象是不是同一個對象。這時,等價于通過“==”去比較這兩個對象。當我們覆蓋了類的 equals() 方法后,通過 equals() 方法比較兩個對象是否相等。比較的是兩個對象的內容相等,若相等則 equals() 方法返回 true;否則返回 fasle。
Java 的 equals() 有 5 大特性:
對稱性:如果x.equals(y)返回是"true",那么y.equals(x)也應該返回是"true"。
反射性:x.equals(x)必須返回是"true"。
類推性:如果x.equals(y)返回是"true",而且y.equals(z)返回是"true",那么z.equals(x)也應該返回是"true"。
一致性:如果x.equals(y)返回是"true",只要x和y內容一直不變,不管你重復x.equals(y)多少次,返回都是"true"。
非空性:x.equals(null),永遠返回是"false";x.equals(和 x 不同類型的對象)永遠返回是"false"。
所以,我們在重寫 equals() 方法的時候,一定要檢驗檢驗是否達到了上面的 5 大特性。這 5 大特性也被稱為 equals() 的 5 大重寫規則。
==
== 的作用是判斷兩個對象的地址是不是相等。即,判斷兩個對象是不試同一個對象。
面試的時候,基本上都會問到 equals 方法與‘==’運算符有什么區別?如果你回答的是:“equals 比較的是對象的內容,而‘==’比較的是對象的地址”。那么這個答案嚴格來說是錯誤的,至少是不完全正確吧。
通過前面的內容我們知道 equals 方法在 Object 中的實現也是直接的使用了‘==’運算符進行比較的。所以回答這個問題一定要嚴謹,加上前置條件。
hashCode()
hashCode() 的作用是獲取哈希碼,也稱為散列碼;它實際上是返回一個 int 整數。一般在 hash 集合中會用到。hashCode() 統一定義在 JDK 的 Object 中,這就意味著 Java 中的任何類都包含有 hashCode() 函數。
那么為什么重寫 equals() 的同時還得重寫 hashCode() 呢?就是因為 HashMap,Hashtable,HashSet 等集合在處理鍵對象的哈希碼來計算存儲位置的時,并不能保證 hash 不沖突。另外在 equals() 方法相等的時候,hashCode() 也不一定相等。
但是在使用散列表時,我們要求如果兩個對象的 equals() 相等,那么它們的 hashCode() 的話, 值一定相同。如果兩個對象 hashCode() 相等,它們的 equals() 并不一定相等。
因為在散列表中,hashCode() 相等,即兩個鍵值對的哈希值相等。然而哈希值相等,并不一定能得出鍵值對相等。補充說一句:“兩個不同的鍵值對,哈希值相等”,這就是哈希沖突。
我們知道 HashSet 是一個不允許存儲重復元素的集合,但是如果你沒有重寫元素類的 equals() 和 hashCode() 的話,HashSet 基本上就失去了意義。這也是為什么很多同學誤用 HashSet,但并沒有用出自己想要的結果的原因。
到此,關于“Java中的equals()、==和hashCode()的用法區別”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。