Java中為什么重寫equals()也需要重寫hashCode方法
Java中為什么重寫equals()也需要重寫hashCode()?
所有類默認繼承Object類 先看一下Object源碼
package java.lang; public class Object { //默認調(diào)用本地的hashcode()方法 根據(jù)內(nèi)存地址生成hash值 避免不了哈希沖突 public native int hashCode(); //默認調(diào)用的equals方法比較的是'=='比較 //基本類型比較的是兩者的值是否相同 而引用類型比較兩者的是引用地址(對象)是否相同 public boolean equals(Object obj) { return (this == obj); } }
結(jié)論
- equals()返回結(jié)果為true hashCode()一定相同
- '=='結(jié)果為true hashCode()一定相同
- '=='結(jié)果為false hashCode()有可能相同(哈希沖突)
hashCode()重寫規(guī)范就是保證equals()相同的兩個對象擁有相同的哈希值
回到剛剛哪個問題 為什么重寫equals還要重寫hashCode()?
關(guān)注公眾號:Java技術(shù)迷,獲取java相關(guān)書籍! public class per { private String name; private int age; public per(String name, int age) { this.name = name; this.age = age; } public boolean equals(Object o){ if (this==o)return true; if (o==null||o.getClass()!=this.getClass())return false; per o1 = (per) o; return o1.name==name&&o1.name!=null&&o1.name.equals(this.name)&&age=o1.age; } public int hashCode(){ return Objects.hash(name,age); } /* 這是Object類中的規(guī)范如果不同時重寫將會導(dǎo)致很多類庫出現(xiàn)業(yè)務(wù)不一致! 例如HashMap無法保證key值'唯一性' 下面測試代碼p1和p2雖然地址不同 但是業(yè)務(wù)上看內(nèi)容是相同的 所以應(yīng)該只用一個key表示 但是不重寫將無法正確插入! */ } class Example{ public static void main(String[] args) { per p1 = new per("張三", 18); per p2 = new per("張三", 18); HashMap<per,Integer> map = new HashMap<>(); map.put(p1,1); map.put(p2,2); //具體原理可以看put(k,v)源碼! } }
到此這篇關(guān)于Java中為什么重寫equals()也需要重寫hashCode()?的文章就介紹到這了,更多相關(guān)Java 重寫equals()為什么重寫hashCode()內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳談Java中instanceof和isInstance的區(qū)別
下面小編就為大家?guī)硪黄斦凧ava中instanceof和isInstance的區(qū)別。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-01-01Java系統(tǒng)變量參數(shù)獲取設(shè)置System.getProperties()的方法
這篇文章主要介紹了Java系統(tǒng)變量參數(shù)System.getProperties()獲取設(shè)置方法,文末給大家提到了Systm.getenv()與System.getProperties()區(qū)別,需要的朋友可以參考下2022-01-01淺談SpringSecurity注解與AOP切面執(zhí)行順序
這篇文章主要介紹了淺談SpringSecurity注解與AOP切面執(zhí)行順序,引入Spring Security后,在Controller的方法中會出現(xiàn)Spring Security的方法注解與AOP同時存在的問題,這是就會設(shè)計順序問題,需要的朋友可以參考下2023-10-10