91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中的equals()、==和hashCode()的用法區別

發布時間:2021-09-14 16:53:01 來源:億速云 閱讀:110 作者:chen 欄目:云計算

這篇文章主要介紹“Java中的equals()、==和hashCode()的用法區別”,在日常操作中,相信很多人在Java中的equals()、==和hashCode()的用法區別問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Java中的equals()、==和hashCode()的用法區別”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

equals()

equals() 的作用是用來判斷兩個對象是否相等。它定義在 JDK 的 Object 類中。源碼如下:

Java中的equals()、==和hashCode()的用法區別

由于 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()的用法區別”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

治多县| 高台县| 静安区| 博白县| 湖南省| 伊金霍洛旗| 昭通市| 盐亭县| 文水县| 布拖县| 唐山市| 神农架林区| 双柏县| 常州市| 潞西市| 滦南县| 浦江县| 盐津县| 宁强县| 建昌县| 桦南县| 富锦市| 天门市| 祁东县| 揭东县| 九寨沟县| 泰安市| 奉化市| 唐海县| 克拉玛依市| 邵阳市| 阜宁县| 阜康市| 田东县| 扎囊县| 子洲县| 云阳县| 郑州市| 囊谦县| 怀远县| 红安县|