成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

面試官最愛的坑:為什么重寫equals時(shí)一定要重寫hashCode?

開發(fā) 前端
為了保證對象的相等性和哈希表的正確性,我們需要在重寫 equals 方法時(shí)也重寫 hashCode 方法。這兩個(gè)方法是密切相關(guān)的,它們一起確保對象在使用散列數(shù)據(jù)結(jié)構(gòu)時(shí)能夠正確工作。

大家好,我是小米,歡迎大家來到我的微信公眾號(hào)!今天,我們將討論一個(gè)在Java開發(fā)中經(jīng)常被問到的問題:“為什么在重寫 equals 方法時(shí)也要重寫 hashCode 方法?”這個(gè)問題可能在你的面試中經(jīng)常出現(xiàn),但它不僅僅是一個(gè)面試題,它還涉及到了Java中非常重要的概念,即對象的相等性和哈希碼。讓我們深入探討這個(gè)問題,并了解為什么它如此重要。

equal 和 hashCode 是什么?

在Java中,每個(gè)對象都有一個(gè)默認(rèn)的 equals 方法,它比較的是對象的引用是否相等,即比較兩個(gè)對象是否是同一個(gè)實(shí)例。但是,在實(shí)際開發(fā)中,我們通常需要比較對象的內(nèi)容是否相等,而不僅僅是比較它們的引用。這就是為什么我們需要重寫 equals 方法的原因。

哈希碼(hashCode)是另一個(gè)與對象相關(guān)的重要概念。哈希碼是一個(gè)整數(shù)值,它是根據(jù)對象的內(nèi)容計(jì)算得出的。在Java中,哈希碼主要用于散列數(shù)據(jù)結(jié)構(gòu),如哈希表。哈希表是一種常用的數(shù)據(jù)結(jié)構(gòu),它可以快速查找存儲(chǔ)在其中的對象。哈希碼可以幫助我們確定對象在哈希表中的存儲(chǔ)位置,從而實(shí)現(xiàn)高效的查找操作。

為什么要重寫 equals 方法?

默認(rèn)情況下,Java中的 equals 方法比較的是對象的引用。如果我們不重寫 equals 方法,那么對于兩個(gè)不同的對象,即使它們的內(nèi)容相同,調(diào)用 equals 方法也會(huì)返回 false,因?yàn)樗鼈兊囊貌煌?/p>

考慮以下示例:

圖片圖片

在這個(gè)示例中,盡管 person1 和 person2 的內(nèi)容相同,但它們是不同的對象,因此 equals 方法返回 false。這顯然不是我們想要的行為。

為了解決這個(gè)問題,我們需要重寫 equals 方法,以便比較對象的內(nèi)容而不是引用。通常,我們會(huì)在自定義類中重寫 equals 方法,以實(shí)現(xiàn)我們自己的相等性邏輯,比較對象的屬性是否相等。

為什么要重寫 hashCode 方法?

好了,現(xiàn)在我們知道了為什么要重寫 equals 方法,但是為什么還需要重寫 hashCode 方法呢?這是因?yàn)樵谑褂蒙⒘袛?shù)據(jù)結(jié)構(gòu)時(shí),比如哈希表,我們希望相等的對象具有相等的哈希碼。

在Java中,哈希表使用哈希碼來確定存儲(chǔ)對象的位置。如果兩個(gè)相等的對象具有不同的哈希碼,那么它們將被存儲(chǔ)在哈希表的不同位置,導(dǎo)致無法正確查找這些對象。

考慮以下示例:

圖片圖片

在這個(gè)示例中,盡管 person3 和 person4 的內(nèi)容相同,但由于它們具有不同的哈希碼,set.contains(person4) 返回 false。這是因?yàn)楣1頍o法正確定位到 person4。

為了解決這個(gè)問題,我們需要確保重寫 equals 方法的對象也必須重寫 hashCode 方法,以便它們的哈希碼是相等的。這樣,哈希表就能夠正確地存儲(chǔ)和查找這些對象了。

重寫 hashCode 方法的規(guī)則

那么,如何正確地重寫 hashCode 方法呢?Java對于 hashCode 方法有一些規(guī)定,這些規(guī)定確保了哈希碼的一致性和性能。

以下是一些重寫 hashCode 方法的規(guī)則:

  • 如果兩個(gè)對象通過 equals 方法相等,那么它們的哈希碼必須相等。
  • hashCode 方法的計(jì)算應(yīng)該是高效的,避免復(fù)雜的計(jì)算。
  • hashCode 方法的結(jié)果應(yīng)該在對象的生命周期內(nèi)保持不變。如果一個(gè)對象的內(nèi)容發(fā)生了變化,它的哈希碼也應(yīng)該保持不變。
  • 對于不相等的對象,哈希碼盡量不要相等,以提高哈希表的性能。

為了遵守這些規(guī)則,通常我們可以使用對象的屬性來計(jì)算哈希碼,比如使用屬性的哈希碼相加或異或來得到對象的哈希碼。

示例:重寫 equals 和 hashCode 方法

讓我們來看一個(gè)示例,如何重寫 equals 和 hashCode 方法:

圖片圖片

在這個(gè)示例中,我們重寫了 equals 方法,比較了 name 和 age 屬性是否相等,然后重寫了 hashCode 方法,使用了 Objects.hash 方法來計(jì)算哈希碼。

END

為了保證對象的相等性和哈希表的正確性,我們需要在重寫 equals 方法時(shí)也重寫 hashCode 方法。這兩個(gè)方法是密切相關(guān)的,它們一起確保對象在使用散列數(shù)據(jù)結(jié)構(gòu)時(shí)能夠正確工作。

當(dāng)你在面試中遇到這個(gè)問題時(shí),不要忘記強(qiáng)調(diào) equals 和 hashCode 方法的一致性和性能,以及遵守重寫 hashCode 方法的規(guī)則。這將幫助你深刻理解這個(gè)重要的概念,并在實(shí)際開發(fā)中正確地使用它們。

責(zé)任編輯:武曉燕 來源: 知其然亦知其所以然
相關(guān)推薦

2021-12-03 06:59:23

HashCodeEquals面試

2021-12-13 09:10:48

equalshashCodeJava

2021-07-30 09:32:55

JavaEquals

2021-03-18 23:38:26

EqualsHashcode方法

2019-08-16 10:10:07

hashcodeequalsJava

2020-12-23 13:29:15

微服務(wù)架構(gòu)面試官

2021-12-30 06:59:28

方法重寫面試

2019-01-29 11:02:30

消息中間件Java互聯(lián)網(wǎng)

2022-05-26 09:24:09

volatile懶漢模式

2021-02-19 10:02:57

HTTPSJava安全

2021-03-05 11:02:14

iOS 14.5蘋果更新

2022-07-06 13:48:24

RedisSentinel機(jī)制

2025-06-03 07:05:00

Linux操作系統(tǒng)Windows

2022-03-21 07:40:08

線程池Executors方式

2023-12-25 09:03:33

MySQL索引數(shù)據(jù)庫

2023-12-06 09:10:28

JWT微服務(wù)

2018-01-19 10:43:06

Java面試官volatile關(guān)鍵字

2011-05-10 15:51:34

SEO

2020-10-24 15:50:54

Java值傳遞代碼

2021-01-21 07:53:29

面試官Promis打印e
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 本道综合精品 | 日本精品一区二区在线观看 | 操人网站 | 91精品国产91久久久久久吃药 | m豆传媒在线链接观看 | 日韩成人免费在线视频 | 欧美精品a∨在线观看不卡 欧美日韩中文字幕在线播放 | 国产成人99久久亚洲综合精品 | 亚洲成人av | www.99re| 日韩亚洲视频 | 日韩一区二区精品 | 日韩影院在线 | 一本色道久久综合亚洲精品高清 | 国产精品久久久久久久午夜片 | www.日韩系列 | 日韩在线中文字幕 | 黄色网毛片 | 久久久久资源 | www.一区二区 | 在线黄av | 午夜视频在线免费观看 | 一区二区精品 | 一级特黄在线 | 午夜免费在线 | 中文字幕一区在线观看视频 | 国产亚洲精品综合一区 | 久久亚洲经典 | 成人欧美一区二区三区视频xxx | 亚洲精品日韩视频 | 亚洲高清中文字幕 | 一级免费在线视频 | www.4567| 天天摸天天干 | 免费观看一级黄色录像 | a级黄色片在线观看 | 日本黄色免费视频 | 亚洲视频二区 | 精品国产一区二区 | av成年人网站 | 亚洲少妇综合网 |