為什么要重寫equals和hashcode方法


當新建一個java類時,需要重寫equals和hashcode方法,大家都知道!但是,為什么要重寫呢?
需要保證對象調用equals方法為true時,hashcode必須相同.

先看下面的例子:
沒有重寫equals和hashcode方法User類

public class User {
  
  private Integer age;
  private String name;

  public User() {
  }

  public User(Integer age, String name) {
    this.age = age;
    this.name = name;
  }

  public Integer getAge() {
    return age;
  }

  public void setAge(Integer age) {
    this.age = age;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }
}
@Test
public void test01(){
  User user1 = new User(12, "lyf");
  User user2 = new User(12, "lyf");
  System.out.println("hashcode值:");
  System.out.println(user1.hashCode());
  System.out.println(user2.hashCode());
  System.out.println("是否相等:");
  System.out.println(user1.equals(user2));
}

 


 

用相同的值創建兩個對象,發現hashcode不同,並且equals也為false.

 

了解hashcode算法的話你會明白,即使hashcode相同值也有可能不同!那么,就需要我們重寫這兩個方法.

@Override
public boolean equals(Object o) {
  if (this == o) return true;
  if (o == null || getClass() != o.getClass()) return false;
  User user = (User) o;
  return Objects.equals(age, user.age) &&
      Objects.equals(name, user.name);
}

@Override
public int hashCode() {
  return Objects.hash(age, name);
}

重新調用的結果:

 


 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM