Java中為什么重寫(xiě)equals()也需要重寫(xiě)hashCode方法
Java中為什么重寫(xiě)equals()也需要重寫(xiě)hashCode()?
所有類默認(rèn)繼承Object類 先看一下Object源碼
package java.lang; public class Object { //默認(rèn)調(diào)用本地的hashcode()方法 根據(jù)內(nèi)存地址生成hash值 避免不了哈希沖突 public native int hashCode(); //默認(rèn)調(diào)用的equals方法比較的是'=='比較 //基本類型比較的是兩者的值是否相同 而引用類型比較兩者的是引用地址(對(duì)象)是否相同 public boolean equals(Object obj) { return (this == obj); } }
結(jié)論
- equals()返回結(jié)果為true hashCode()一定相同
- '=='結(jié)果為true hashCode()一定相同
- '=='結(jié)果為false hashCode()有可能相同(哈希沖突)
hashCode()重寫(xiě)規(guī)范就是保證equals()相同的兩個(gè)對(duì)象擁有相同的哈希值
回到剛剛哪個(gè)問(wèn)題 為什么重寫(xiě)equals還要重寫(xiě)hashCode()?
關(guān)注公眾號(hào):Java技術(shù)迷,獲取java相關(guān)書(shū)籍! 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ī)范如果不同時(shí)重寫(xiě)將會(huì)導(dǎo)致很多類庫(kù)出現(xiàn)業(yè)務(wù)不一致! 例如HashMap無(wú)法保證key值'唯一性' 下面測(cè)試代碼p1和p2雖然地址不同 但是業(yè)務(wù)上看內(nèi)容是相同的 所以應(yīng)該只用一個(gè)key表示 但是不重寫(xiě)將無(wú)法正確插入! */ } 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中為什么重寫(xiě)equals()也需要重寫(xiě)hashCode()?的文章就介紹到這了,更多相關(guān)Java 重寫(xiě)equals()為什么重寫(xiě)hashCode()內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Security認(rèn)證提供程序示例詳解
這篇文章主要給大家介紹了關(guān)于Spring Security認(rèn)證提供程序的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Spring Security具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05詳談Java中instanceof和isInstance的區(qū)別
下面小編就為大家?guī)?lái)一篇詳談Java中instanceof和isInstance的區(qū)別。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-01-01Java實(shí)現(xiàn)常見(jiàn)排序算法的優(yōu)化
今天給大家?guī)?lái)的是關(guān)于Java的相關(guān)知識(shí),文章圍繞著Java實(shí)現(xiàn)常見(jiàn)排序算法的優(yōu)化展開(kāi),文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-01-01Java系統(tǒng)變量參數(shù)獲取設(shè)置System.getProperties()的方法
這篇文章主要介紹了Java系統(tǒng)變量參數(shù)System.getProperties()獲取設(shè)置方法,文末給大家提到了Systm.getenv()與System.getProperties()區(qū)別,需要的朋友可以參考下2022-01-01通過(guò)原理解析Spring mvc的內(nèi)置編碼過(guò)濾器
這篇文章通過(guò)原理主要給大家解析了關(guān)于Spring mvc的內(nèi)置編碼過(guò)濾器的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-09-09java多線程消息隊(duì)列的實(shí)現(xiàn)代碼
本篇文章主要介紹了java多線程消息隊(duì)列的實(shí)現(xiàn)代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-07-07淺談SpringSecurity注解與AOP切面執(zhí)行順序
這篇文章主要介紹了淺談SpringSecurity注解與AOP切面執(zhí)行順序,引入Spring Security后,在Controller的方法中會(huì)出現(xiàn)Spring Security的方法注解與AOP同時(shí)存在的問(wèn)題,這是就會(huì)設(shè)計(jì)順序問(wèn)題,需要的朋友可以參考下2023-10-10