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)文章
圖文講解IDEA中根據(jù)數(shù)據(jù)庫(kù)自動(dòng)生成實(shí)體類
這篇文章主要以圖文講解IDEA中根據(jù)數(shù)據(jù)庫(kù)自動(dòng)生成實(shí)體類,本文主要以Mysql數(shù)據(jù)庫(kù)為例,應(yīng)該會(huì)對(duì)大家有所幫助,如果有錯(cuò)誤的地方,還望指正2023-03-03
java實(shí)現(xiàn)圖片寫(xiě)入高清字體及帶邊框的方法
這篇文章主要介紹了java實(shí)現(xiàn)圖片寫(xiě)入高清字體及帶邊框的方法,涉及java針對(duì)圖片及文字的相關(guān)操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07
springboot之Validation參數(shù)校驗(yàn)詳細(xì)解讀
這篇文章主要介紹了springboot之Validation參數(shù)校驗(yàn)詳細(xì)解讀,本篇是關(guān)于springboot的參數(shù)校驗(yàn)知識(shí),當(dāng)然也適用其它java應(yīng)用,讀完本篇將學(xué)會(huì)基本的參數(shù)校驗(yàn),自定義參數(shù)校驗(yàn)和分組參數(shù)校驗(yàn),需要的朋友可以參考下2023-10-10
Spring Boot項(xiàng)目添加外部Jar包以及配置多數(shù)據(jù)源的完整步驟
這篇文章主要給大家介紹了關(guān)于Spring Boot項(xiàng)目添加外部Jar包以及配置多數(shù)據(jù)源的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
Java 讀取、獲取配置文件.properties中的數(shù)據(jù)
這篇文章主要介紹了Java 讀取、獲取配置文件.properties中的數(shù)據(jù),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-09-09

