轉自 https://www.cnblogs.com/silence-hust/p/4558701.html
一、為什么要重寫equals方法呢?
因為繼承Objec的equals方法只能判斷兩個對象是否是同一個對象。可是我們認為常用的equals方法應該具有邏輯判斷功能,所以我們重寫equals方法,可以按照我們所需的要求自定義。
二、怎樣重寫equals方法?
1.自反性:對於任何非空引用x,x.equals(x)應該返回true。
2.對稱性:對於任何引用x和y,如果x.equals(y)返回true,那么y.equals(x)也應該返回true。
3.傳遞性:對於任何引用x、y和z,如果x.equals(y)返回true,y.equals(z)返回true,那么x.equals(z)也應該返回true。
4.一致性:如果x和y引用的對象沒有發生變化,那么反復調用x.equals(y)應該返回同樣的結果。
5.非空性:對於任意非空引用x,x.equals(null)應該返回false。
三、代碼
public class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } 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; } @Override public boolean equals(Object obj) { if (this == obj) return true; //自反性 if (obj == null || this.getClass() != obj.getClass()) { //傳遞性,非空性 return false; } Person person = (Person) obj; return this.getName().equals(((Person) obj).getName()) && this.getAge() == ((Person) obj).getAge(); } @Override public int hashCode() { return Objects.hash(getName(), getAge()); } }