java_重寫hashCode
阿新 • • 發佈:2021-01-03
重寫hashCode
1.hashCode是什麼?
> hashCode是根據地址計算出來的十進位制的數值,是地址的表現形式。
hashCode是根據地址算出來的一個數值 用於表示不同的物件在記憶體中的不同的空間
2.為什麼需要重寫hashCode
在一些雜湊資料結構中 如果兩個物件使用equals比較為true 那麼這兩個物件的hashCode必須相同
注意:我們只是重寫的hashCode 但並不會影響地址
String型別的hashCode已被JDK重寫,和String型別的equals方法情況類似。
public class Person {
private String name;
private String idCard;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getIdCard() {
return idCard;
}
public void setIdCard(String idCard) {
this.idCard = idCard;
}
public Person () {
}
public Person(String name, String idCard) {
this.name = name;
this.idCard = idCard;
}
public boolean equals(Object obj) {
// 自動提升 手動下降
if(this == obj) {
return true;
}
if(obj instanceof Person) {
Person p = (Person)obj;
if((this.getName().equals(p.getName())) && (this.getIdCard().equals(p.getIdCard()))) {
return true;
}
}
return false;
}
// 重寫hashCode
// hashCode是什麼?
// hashCode是根據地址算出來的一個數值 用於表示不同的物件在記憶體中的不同的空間
// 為什麼需要重寫hashCode
// 在一些雜湊資料結構中 如果兩個物件使用equals比較為true 那麼這兩個物件的hashCode必須相同
// 注意:我們只是重寫的hashCode 但並不會影響地址
public int hashCode() {
// result表示結果 用於最終返回
int result = 1;
// 權重 31 是一個比較合適的數值 用於計算hashCode
// 我們的計算器是如何進行數學計算的?
// 20 * 30
// 使用31是因為 任何數乘以31 等於這個數 左移5位 - 這個數本身
//JDK中也用31
// 左移幾位 表示乘以2的幾次方
// 右移幾位 表示除以2的幾次方
int prime = 31;
result = result * prime + (this.getName() == null ? 0 :this.getName().hashCode());
result = result * prime + (this.getIdCard() == null ? 0 : this.getIdCard().hashCode());
return result;
}
public static void main(String[] args) {
Person person1 = new Person("汪淼", "4512157875121245421");
Person person2 = new Person("汪淼", "4512157875121245421");
//重寫後的equals()方法,比較內容,結果為true
System.out.println(person1.equals(person2));
System.out.println(person1.hashCode());
System.out.println(person2.hashCode());
//"=="比較的是地址,不同的物件地址不同,重寫hashCode不影響地址,結果為false
System.out.println(person1 == person2);
}
}
結果: