爲何重寫 equals 方法 必須重寫 hashCode

  本身學到這,就記錄了下來,代碼都是本身敲得,有不對的地方但願大神指點出來
爲何重寫 equals 方法 必須重寫 hashCode
  若是你重寫了equals,好比說是基於對象的內容實現的,而不重寫 HashCode,那麼極可能某兩個對象明明是「相等」,而hashCode卻不同.那麼就會返回 false。例如在 HashSet 集合中,不容許存在相同元素,可是當你 new 兩個對象,對象內容相同時,在 HashSet 集合中就存在了相同的兩個元素,如何解決這個問題?那就要重寫 equals 方法,可是重寫 equals 方法還不能解決問題,由於在 HashSet 中判斷兩個元素是否相等是首先判斷 hashCode 內存地址是否相等,若是不等在用 equals 方法判斷內容是否相等,因爲 new 了兩個對象,雖然內容相同,可是在內存中開闢兩兩塊地址,hashCode 確定不一樣,因此還要重寫 hashCode 方法。
 
下面是代碼說明
public class Person {
//隨便定義個類
  private int id;
  private String name;
  private int age;
  //set get 方法
  public int getId() {
    return id;
  }
  public void setId(int id) {
    this.id = id;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
   public int getAge() {
    return age;
  }
  public void setAge(int age) {
    this.age = age;
  }
  //構造方法
  public Person(int id,String name, int age) {
    this.id=id;
    this.name = name;
    this.age = age;
  }
  //重寫 hashCode 方法
  public int hashCode() {
    return this.getId();
  }
  //重寫 equals 方法
  public boolean equals(Object obj) {
    if(this==obj){
      return true;
    }
    if(obj instanceof Person){
      if(this.getId()==((Person) obj).getId()){
        return true;
      }
    }
    return false;
  }
}
 
  測試類中代碼
  //實例化
  Person p1 = new Person(1,"張三",12);
  Person p2 = new Person(1,"張三",12);
  // 聲明 HashSet 集合類
  HashSet<Person> h = new HashSet<Person>();
  //添加數據
  h.add(p1);
  h.add(p2);
  //遍歷集合
  for(Person per :h){
    System.out.println(per.getName());
  }
 
不重寫 equals 和 hashCode 方法的執行結果
只重寫 equals 方法的執行結果
重寫 equals 和 hashCode 方法的執行結果
 
相關文章
相關標籤/搜索