什么时候会重写equals和hashcode方法

什么时候会重写equals和hashcode方法

在Java中,通常情况下,当你使用自定义类的实例作为集合的元素、键(key)或者在需要进行对象比较的场景,你可能会需要重写 equals() 和 hashCode() 方法。这两个方法在 Object 类中定义,但默认的实现是基于对象的内存地址,而不是基于对象的内容。通过重写这两个方法,你可以自定义对象相等性的判断和哈希码的生成。

equals() 方法:

用于判断两个对象是否相等。

如果不重写 equals() 方法,它默认是比较对象的引用,即比较对象是否是同一实例。

重写时通常需要考虑对象的内容是否相等,而不仅仅是比较引用。

@Override

public boolean equals(Object obj) {

if (this == obj) return true;

if (obj == null || getClass() != obj.getClass()) return false;

MyClass myObj = (MyClass) obj;

// 比较对象的内容,根据实际需要自定义比较逻辑

return this.field1.equals(myObj.field1) && this.field2.equals(myObj.field2);

}

hashCode() 方法:

用于生成对象的哈希码,通常在集合中使用。

如果不重写 hashCode() 方法,它默认会返回对象的内存地址的哈希码。

重写时通常需要根据 equals() 方法中用于比较的字段来生成哈希码。

@Override

public int hashCode() {

// 根据对象的内容生成哈希码,根据实际需要自定义生成逻辑

return Objects.hash(field1, field2);

}

需要重写的场景:

当你希望两个对象在逻辑上相等,即具有相同的业务内容时,需要重写 equals() 和 hashCode() 方法。

在使用集合类(如 HashMap、HashSet)存储自定义对象时,通常需要重写这两个方法,以确保对象的唯一性和正确的比较行为。

注意事项:

保持 equals() 方法的传递性、自反性、对称性和一致性。

始终同时重写 equals() 和 hashCode() 方法,以保持它们之间的一致性。

尽量不要使用浮点数进行哈希码的计算,因为浮点数计算可能因为精度问题导致哈希码不稳定。

总体来说,当你希望自定义类的实例在逻辑上相等时,需要考虑重写 equals() 和 hashCode() 方法。这样可以确保对象在集合和散列表等数据结构中的正确行为。

*** 什么情况重写?为什么重写?

https://blog.csdn.net/kris1025/article/details/104718537