日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

不同时重写equals和hashCode又会怎样?

發布時間:2025/3/21 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 不同时重写equals和hashCode又会怎样? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

作者:flyhero

微信公眾號:碼上實戰(ID:Push-Code)

可能一問到equals和hashCode相關的問題,就會有人講他們的自反性,對稱性,一致性,傳遞性等幾條約定了,此時我不得不佩服,這么多約定竟然都能記得,但我不知道你是不是真的理解呢。

一、我不同時重寫又能如何呢?

我只能說只要你不碰到這幾個主,你也沒什么事的!

1、為什么不能遇到它們幾個呢?

因為它們幾個會用到hashCode方法。

2、他們用hashCode方法來干嘛?

hashCode方法是根據對象的地址生成的一個int整數,默認它和地址一一對應的,如果不重寫,那么只有對象地址一樣的情況下,哈希值才相等。

equals默認用來比較地址是否相同,但當集合中元素增多時,再使用equals判斷,效率是比較低的;而哈希值是可以快速定位到指定的元素的,所以默認Java就使用哈希值來比較定位,因此有了Object.hashCode的約定。

Set怎么實現存儲不重復的元素的?HashMap怎么判斷相同的key的?有興趣可去深入了解一下。

二、例子

小王在「堆」中有兩套房產,這兩套房產位于不同的地址。現在我想要判斷這兩套房子是否是同一個主人?

于是我去問Object,而Object告訴我這兩套房產不是一個人的!

我:為什么呢?

Object: equals告訴我兩套房子離了十萬八千里,在不同的地方(地址),當然不是同一個人了。

我:這邏輯……(不符合我們常規的認知啊)

既然這樣,那我只能重寫equals了!

哈哈,好啦,現在equals終于知道這兩個房子是同一人的啦!

然而在房產管理局(HashMap)我得到一個消息:小王只要一套房產!

WTF!我白干了!

房產管理局(HashMap): 不信你看!

遇到你真是倒霉了,原來房產管理局(HashMap)使用了hashCode來計算的!想要正確的統計小王的房產只能重寫hashCode方法了。

此時,他們統計終于對了!!!

三、總結

除非你能保證你重寫equals的類不被Set,Map使用,否則你就必須同時重寫equals和hashCode。

你能保證嗎?如果不想同時重寫,你可以這樣:

信不信這樣寫,老大看到后,就say goodbye了!

四、如何重寫equals與hashCode

我就不寫出常說的那些約定性質了,寫了也記不住。說說如何避免違反這些約定:

1、重寫equals

  • ????通過==判斷是否是同一個引用

  • ????通過instanceof判斷是否是相同類型

  • ????把參數轉為正確的類型

  • ????對比雙方各個屬性值是否相同

如:

2、重寫hashCode

hashCode方法應該為“不相等的對象產生不相等的哈希值”

一般計算是根據你equals中用來比較的屬性的hashCode組合計算的,不過目前JDK和一些類庫已經給我提供了很好的重寫方式,我們可不必去深究其中算法。

方式一:

使用了JDK自帶Objects提供的靜態方法。

方式二:

使用了lombok類庫,直接在類上注解即可。

另外,大家可以參考一篇文章:《看似簡單的hashCode和equals面試題,竟然有這么多坑!》

總結

以上是生活随笔為你收集整理的不同时重写equals和hashCode又会怎样?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。