正確重寫equals和hashCode需遵循規(guī)范:先用==和instanceof判斷引用與類型,再比較關(guān)鍵字段;hashCode應(yīng)包含相同字段并用Objects.hash()實(shí)現(xiàn),確保相等對(duì)象有相同哈希值。
在Java中正確重寫equals
和hashCode
方法是保證對(duì)象在集合類(如HashMap、HashSet)中正常工作的關(guān)鍵。這兩個(gè)方法都繼承自Object
類,如果重寫不當(dāng),可能導(dǎo)致邏輯錯(cuò)誤或性能問題。
equals方法用于判斷兩個(gè)對(duì)象是否“相等”。重寫時(shí)必須遵循Java規(guī)范中的等價(jià)關(guān)系:自反性、對(duì)稱性、傳遞性和一致性,并且與null
比較應(yīng)返回false
。
以下是重寫equals
的標(biāo)準(zhǔn)步驟:
==
檢查是否是同一個(gè)引用,提高性能instanceof
檢查傳入對(duì)象是否為當(dāng)前類類型==
,引用類型建議用Objects.equals()
)@Override public boolean equals(Object obj) { if (this == obj) return true; if (!(obj instanceof Person)) return false; Person other = (Person) obj; return Objects.equals(this.name, other.name) && this.age == other.age; }
核心規(guī)則:如果兩個(gè)對(duì)象通過equals
判定相等,那么它們的hashCode
必須相同。反之則不一定。
立即學(xué)習(xí)“Java免費(fèi)學(xué)習(xí)筆記(深入)”;
重寫hashCode
時(shí)應(yīng):
equals
比較的字段hashCode
4簡化實(shí)現(xiàn)@Override public int hashCode() { return Objects.hash(name, age); }
開發(fā)者常犯的錯(cuò)誤包括:
equals
而忘了hashCode
——這會(huì)導(dǎo)致HashMap行為異常equals
或hashCode
依據(jù),并在對(duì)象加入集合后修改它們equals
中使用Object
0嚴(yán)格類型檢查,破壞了繼承下的對(duì)稱性(通常用instanceof
更合適)如果你的類是不可變的(如String),重寫這兩個(gè)方法非常安全。如果是可變類,盡量避免將其作為HashMap的key。
大多數(shù)IDE(如IntelliJ IDEA、Eclipse)支持自動(dòng)生成equals
和hashCode
方法。也可以使用Lombok的Object
4注解簡化代碼:
@EqualsAndHashCode public class Person { private String name; private int age; }
但使用注解時(shí)要清楚它默認(rèn)包含所有非靜態(tài)字段,必要時(shí)可通過Object
5或Object
6指定字段。
基本上就這些。只要保證equals
和hashCode
邏輯一致,不依賴可變狀態(tài),就能避免大部分問題。
以上就是如何在Java中正確重寫equals和hashCode方法的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注php中文網(wǎng)其它相關(guān)文章!
每個(gè)人都需要一臺(tái)速度更快、更穩(wěn)定的 PC。隨著時(shí)間的推移,垃圾文件、舊注冊(cè)表數(shù)據(jù)和不必要的后臺(tái)進(jìn)程會(huì)占用資源并降低性能。幸運(yùn)的是,許多工具可以讓 Windows 保持平穩(wěn)運(yùn)行。
微信掃碼
關(guān)注PHP中文網(wǎng)服務(wù)號(hào)
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號(hào)