equals和hashcode的联系和区别

本文详细阐述了Java中equals方法的四个特性:自反性、对称性、传递性和一致性,以及非空与空比较的特性。同时,讨论了hashCode方法的一致性和跟随性,并强调了在重写equals时必须重写hashCode的重要性。这些概念对于理解Java对象的比较和哈希表的运作至关重要。

总结

equals方法的特性:

自反性:就是自己反过来跟自己比,要返回true;比如x.equals(x) == true
对称性:就是x.equals(y) == true时,也要y.equals(y) == true
传递性:就是x.equals(y) == true,同时y.equals(z) == true,那么x.equals(z) == true
一致性:就是传说中的幂等性,即x.equals(y)调用多次,都应该返回一样的结果
非空和空比较则返回false的特性:就是x.equals(y)中,如果x非空,而y空,则返回false

hashCode的特性以及和equals的联系

一致性:无论hashCode调用多少次,都应该返回一样的结果(这一点跟equals很像)
跟随性(自己编的一个性):如果两个对象的equals返回为真,那么hashCode也应该相等
反过来,如果两个对象的equals返回为假,那么hashCode有可能相等,但是如果散列的足够好,那么通常来说hashCode()也不应该相等
覆写equals方法时,一定要覆写hashCode方法

Java中,`equals()` `hashCode()` 是 `Object` 类中定义的两个方法,它们在对象比较集合操作中扮演着关键角色。尽管它们通常一起被重写,但它们的用途行为存在显著区别。 ### `equals()` 方法的作用 `equals()` 方法用于判断两个对象是否“逻辑相等”。默认情况下,它比较的是对象的引用地址,即只有两个引用指向同一个对象时才返回 `true`。然而,在自定义类中,通常需要根据对象的实际属性来判断相等性。例如,一个 `Person` 类可能根据姓名年龄字段来判断两个对象是否相等。因此,此时需要重写 `equals()` 方法以实现自定义的相等性判断[^2]。 ### `hashCode()` 方法的作用 `hashCode()` 方法返回对象的哈希码值,该值被用于哈希表(如 `HashMap`、`HashSet`)中以提高查找效率。默认情况下,它的实现通常基于对象的内存地址。然而,为了确保与 `equals()` 方法的一致性,如果两个对象通过 `equals()` 方法判断为相等,则它们的 `hashCode()` 值必须相同。这样可以保证这些对象在使用哈希结构的集合时能被正确处理[^2]。 ### 区别总结 1. **功能目的不同**: - `equals()` 用于判断两个对象是否相等。 - `hashCode()` 用于生成对象的哈希码,辅助哈希集合快速定位对象。 2. **实现一致性要求**: - 如果两个对象 `equals()` 返回 `true`,则它们的 `hashCode()` 必须相同。 - 反过来,如果两个对象的 `hashCode()` 相同,它们的 `equals()` 不一定返回 `true`,即可能发生哈希冲突。 3. **集合类行为影响**: - `equals()` 决定对象是否被视为重复。 - `hashCode()` 决定对象在哈希结构中的存储位置,影响性能[^2]。 ### 示例说明 以下是一个简单的 `Person` 类示例,展示了如何正确重写 `equals()` `hashCode()` 方法: ```java import java.util.Objects; public class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Person person = (Person) o; return age == person.age && name.equals(person.name); } @Override public int hashCode() { return Objects.hash(name, age); } } ``` 在该示例中,`equals()` 方法确保两个 `Person` 对象在姓名年龄相同时被视为相等;`hashCode()` 方法使用 `Objects.hash()` 方法生成基于这两个字段的哈希码,从而保证相等的对象具有相同的哈希值。 ### 重写时的注意事项 - **空值处理**:在 `equals()` 中必须检查 `null` 类型匹配。 - **对称性传递性**:确保 `equals()` 的实现满足对称性(`a.equals(b)` 等价于 `b.equals(a)`)传递性(如果 `a.equals(b)` `b.equals(c)` 都为 `true`,则 `a.equals(c)` 也必须为 `true`)。 - **一致性**:多次调用 `hashCode()` 方法在对象未被修改的情况下应返回相同值。 - **性能**:高效的 `hashCode()` 实现可以减少哈希冲突,提升集合性能。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值