关于重写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()方法及其简单的应用”的内容,你了解清楚吗?希望对你有所帮助,任何问题可以给我留言,让我们下期再见吧。