中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

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

博罗县| 新安县| 苏尼特右旗| 库尔勒市| 车险| 漳州市| 弋阳县| 大足县| 繁昌县| 额敏县| 偏关县| 古蔺县| 定日县| 韶关市| 丰县| 石城县| 曲阜市| 清水县| 澳门| 梁河县| 赤水市| 云梦县| 铜陵市| 敦化市| 沙雅县| 襄樊市| 木里| 安陆市| 甘谷县| 天长市| 城固县| 九江市| 永寿县| 新巴尔虎左旗| 石家庄市| 民权县| 平远县| 华安县| 洞口县| 公安县| 常德市|