一、为什么要重写
在Java中,重写equals和hashCode方法是非常重要的,尤其是在以下几种情况下:
1.对象比较:
equals方法用于判断两个对象是否相等。默认情况下,Object类的equals方法是比较对象的引用是否相同。如果自定义了对象的相等条件(例如根据某些字段值来判断),则需要重写equals方法。
2.集合操作:
在使用集合类(如HashSet、HashMap、ArrayList等)时,equals和hashCode方法的正确实现非常重要。例如,HashSet依赖hashCode方法来确定对象的存储位置,而equals方法用于验证对象是否真正相等。
3.一致性:
为了保证equals和hashCode方法的一致性,即如果两个对象通过equals方法判断为相等,那么它们的hashCode值也必须相等。反之,如果两个对象的hashCode值不相等,那么它们一定不相等。
4.性能优化:
hashCode方法可以提高集合操作的性能。例如,在HashMap中,hashCode方法用于快速定位桶的位置,从而减少查找时间。
二、示例
1.假设我们有一个Person类,没有重写equals和hashCode方法
public class Person {
private int id;
private String name;
public Person(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Person{id=" + id + ", name='" + name + "'}";
}
}
2.使用Person对象的集合示例
public class Test {
public static void main(String[] args) {
// 创建一些Person对象
Person person1 = new Person(1, "Alice");
Person person2 = new Person(1, "Alice");
Person person3 = new Person(2, "Bob");
// 使用HashSet
Set<Person> set = new HashSet<>();
set.add(person1);
set.add(person2);
set.add(person3);
System.out.println("HashSet: " + set);
// 使用List
List<Person> list = new ArrayList<>();
list.add(person1);
list.add(person2);
list.add(person3);
System.out.println("ArrayList: " + list);
// 使用Map
Map<Person, String> map = new HashMap<>();
map.put(person1, "Value1");
map.put(person2, "Value2");
map.put(person3, "Value3");
System.out.println("HashMap: " + map);
}
}
3.输出结果如下
同理,在HashMap中person1和person2被视为不同的键,因此map.put(person2, "Value2")会成功添加到映射中,而不是覆盖person1的值。
4.Person类中重写equals和hashCode方法
方法一:IDEA快捷键:Alt+Insert 可快速生成
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return id == person.id && Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(id, name);
}
方法二:在Person类使用Lombok的 @EqualsAndHashCode注解
@EqualsAndHashCode
public class Person {
...
}
5.重写后再次运行结果如下
重写equals和hashCode方法后,对象在集合中的行为更加符合预期,能够正确地进行对象的比较和查找。这对于确保集合操作的正确性和性能至关重要。