关于重写equals()方法和hashCode()方法及其简单的应用,以下是详细内容:
一、重写equals()方法

equals()方法概述
定义:equals()方法是Java中用于比较两个对象是否相等的方法,默认实现是比较对象的引用地址。
作用:主要用于判断两个对象在逻辑上是否相等,对于自定义类的对象,需要根据其属性来判断是否相等。
重写规则
自反性:x.equals(x)必须返回true。
对称性:x.equals(y)为true时,y.equals(x)也必须为true。
传递性:如果x.equals(y)为true且y.equals(z)为true,则x.equals(z)也必须为true。
一致性:多次调用x.equals(y)只要对象未被修改,结果应一致。
非空性:任何对象与null比较都应返回false。
代码示例
@Override
public boolean equals(Object o) {
if (this == o) return true; // 检查是否是同一个对象
if (o == null || getClass() != o.getClass()) return false; // 检查是否为null或类型不同
// 强制类型转换
Cat cat = (Cat) o;
// 比较属性值
return Objects.equals(name, cat.name) && age == cat.age;
}
二、重写hashCode()方法
hashCode()方法概述
定义:hashCode()方法是Java中用于生成对象的哈希码的方法,默认实现基于对象的内存地址。

作用:主要用于提高集合类(如HashSet、HashMap)的性能,通过哈希码快速定位对象。
重写规则
一致性:在Java应用程序执行期间,对同一对象多次调用hashCode()方法应返回相同的整数。
相等对象的哈希码必须相等:如果两个对象根据equals()方法是相等的,那么它们的hashCode()方法必须返回相同的整数。
代码示例
@Override
public int hashCode() {
return Objects.hash(name, age);
}
三、简单应用示例
实体类Cat
1.1 Cat类定义
package com;
import java.util.Objects;
public class Cat implements Comparable<Cat>{
private String name;
private int age;
public Cat() {}
public Cat(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 o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Cat cat = (Cat) o;
return age == cat.age && Objects.equals(name, cat.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
@Override
public int compareTo(Cat other) {
return Integer.compare(this.age, other.age);
}
}
测试类Main
2.1 Main类定义
package com;
public class Main {
public static void main(String[] args) {
Cat cat1 = new Cat("Tom", 3);
Cat cat2 = new Cat("Tom", 3);
Cat cat3 = new Cat("Jerry", 5);
System.out.println(cat1.equals(cat2)); // true
System.out.println(cat1.equals(cat3)); // false
System.out.println(cat1.hashCode() == cat2.hashCode()); // true
System.out.println(cat1.hashCode() == cat3.hashCode()); // false
}
}
四、常见问题与解答栏目
1. 为什么在重写equals()方法后必须重写hashCode()方法?
答:在Java中,当两个对象通过equals()方法比较是相等的时候,它们的hashCode()方法必须返回相同的整数值,这是为了维护hashCode()的一般契约,该契约规定了相等的对象必须有相等的哈希码,如果不这样做,在使用哈希集合(如HashSet、HashMap)时会导致逻辑错误和性能问题,如果两个对象根据equals()方法相等,但它们的hashCode()方法返回不同的值,那么在使用哈希集合存储这些对象时,可能会导致无法正确查找到对象。
2. 如何确保重写的hashCode()方法具有良好的分布性和效率?

答:要确保重写的hashCode()方法具有良好的分布性和效率,可以遵循以下几点建议:
使用关键属性:选择对象的关键属性来计算哈希码,这些属性应该是那些能够唯一标识对象的属性,对于一个表示人的类,可以使用姓名和生日等属性。
使用质数乘积:在计算哈希码时,使用质数作为乘数可以减少哈希冲突的概率,可以使用31作为乘数,因为它是一个奇质数,并且在用移位和减法操作来代替乘法时,效果也很好。
混合属性值:将不同属性的值混合起来,以减少哈希冲突的可能性,可以使用属性值的异或、加法或乘法操作来组合它们。
避免简单相加:简单地将所有属性值相加可能会导致哈希冲突较多,因为不同的属性值组合可能会产生相同的和,应该使用更复杂的组合方式来减少冲突的可能性。
小伙伴们,上文介绍了“关于重写equals()方法和hashCode()方法及其简单的应用”的内容,你了解清楚吗?希望对你有所帮助,任何问题可以给我留言,让我们下期再见吧。














