所有類默認繼承Object類 先看一下Object原始碼
package java.lang;
public class Object {
//默認呼叫本地的hashcode()方法 根據記憶體地址生成hash值 避免不了哈希沖突
public native int hashCode();
//默認呼叫的equals方法比較的是'=='比較
//基本型別比較的是兩者的值是否相同 而參考型別比較兩者的是參考地址(物件)是否相同
public boolean equals(Object obj) {
return (this == obj);
}
}
結論
- equals()回傳結果為true hashCode()一定相同
- '=='結果為true hashCode()一定相同
- '=='結果為false hashCode()有可能相同(哈希沖突)
hashCode()重寫規范就是保證equals()相同的兩個物件擁有相同的哈希值
回到剛剛哪個問題 為什么重寫equals還要重寫hashCode()?
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類中的規范如果不同時重寫將會導致很多類別庫出現業務不一致!
例如HashMap無法保證key值'唯一性'
下面測驗代碼p1和p2雖然地址不同 但是業務上看內容是相同的
所以應該只用一個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)原始碼!
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/551172.html
標籤:其他
上一篇:【NLP教程】用python呼叫百度AI開放平臺進行情感傾向分析
下一篇:返回列表
