欢迎光临
我们一直在努力

如何正确地重写equals和hashCode方法?探索其在Java中的应用与重要性

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

一、重写equals()方法

关于重写equals方法和hashCode方法及其简单的应用

equals()方法概述

定义equals()方法是Java中用于比较两个对象是否相等的方法,默认实现是比较对象的引用地址。

作用:主要用于判断两个对象在逻辑上是否相等,对于自定义类的对象,需要根据其属性来判断是否相等。

重写规则

自反性x.equals(x)必须返回true

对称性x.equals(y)true时,y.equals(x)也必须为true

传递性:如果x.equals(y)truey.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中用于生成对象的哈希码的方法,默认实现基于对象的内存地址。

关于重写equals方法和hashCode方法及其简单的应用

作用:主要用于提高集合类(如HashSetHashMap)的性能,通过哈希码快速定位对象。

重写规则

一致性:在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()的一般契约,该契约规定了相等的对象必须有相等的哈希码,如果不这样做,在使用哈希集合(如HashSetHashMap)时会导致逻辑错误和性能问题,如果两个对象根据equals()方法相等,但它们的hashCode()方法返回不同的值,那么在使用哈希集合存储这些对象时,可能会导致无法正确查找到对象。

2. 如何确保重写的hashCode()方法具有良好的分布性和效率?

关于重写equals方法和hashCode方法及其简单的应用

:要确保重写的hashCode()方法具有良好的分布性和效率,可以遵循以下几点建议:

使用关键属性:选择对象的关键属性来计算哈希码,这些属性应该是那些能够唯一标识对象的属性,对于一个表示人的类,可以使用姓名和生日等属性。

使用质数乘积:在计算哈希码时,使用质数作为乘数可以减少哈希冲突的概率,可以使用31作为乘数,因为它是一个奇质数,并且在用移位和减法操作来代替乘法时,效果也很好。

混合属性值:将不同属性的值混合起来,以减少哈希冲突的可能性,可以使用属性值的异或、加法或乘法操作来组合它们。

避免简单相加:简单地将所有属性值相加可能会导致哈希冲突较多,因为不同的属性值组合可能会产生相同的和,应该使用更复杂的组合方式来减少冲突的可能性。

小伙伴们,上文介绍了“关于重写equals()方法和hashCode()方法及其简单的应用”的内容,你了解清楚吗?希望对你有所帮助,任何问题可以给我留言,让我们下期再见吧。

赞(0)
版权声明:本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
文章名称:《如何正确地重写equals和hashCode方法?探索其在Java中的应用与重要性》
文章链接:https://yuyunkj.com/article/8554.html
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。

评论 抢沙发