1. 程式人生 > 其它 >java_重寫hashCode

java_重寫hashCode

技術標籤:javajavahashcode

重寫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); } }

結果:
在這裡插入圖片描述