public int hashCode() {
System.out.println(this.name + ".....hashCode");
return this.hashCode() + this.age * 7; // 遞歸調用自身!
}
this.hashCode() 在方法內部調用了**自身**,導致無限遞歸,最終 StackOverflowError(表現為程序卡死/死循環)。
@Override
public int hashCode() {
int result = name != null ? name.hashCode() : 0;
result = 31 * result + age;
return result;
}
// 或使用 Objects.hash (Java 7+)
@Override
public int hashCode() {
return Objects.hash(name, age);
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (!(obj instanceof Person)) return false;
Person other = (Person) obj;
return age == other.age && Objects.equals(name, other.name);
}
核心原則:equals 相等的對象,hashCode 必須相等。以上實現滿足該契約。
this.hashCode() 會調用父類 Object.hashCode()(返回對象地址哈希)。實際上 this.hashCode() 解析為**當前類重寫後的方法**,形成遞歸。System.identityHashCode(this),但極少用於業務 hashCode 實現。equals() 和 hashCode(),保持一致性。final(不可變對象),避免放入集合後修改字段導致哈希值改變、無法查找/刪除。super.hashCode() 組合。hashCode() 方法中調用 this.hashCode() 導致無限遞歸死循環。修正為基於業務字段(name、age)計算哈希值,配合 equals() 正確重寫,即可正常用於 HashSet/HashMap。