行业资讯 2025年08月6日
0 收藏 0 点赞 672 浏览 2675 个字
摘要 :

文章目录 equals和hashCode概念 重写equals和hashCode 总结 本文主要讲解关于Java 重写equals、hashcode比较两个对象是否相等相关内容,让我们来一起学习下吧! equals……




本文主要讲解关于Java 重写equals、hashcode比较两个对象是否相等相关内容,让我们来一起学习下吧!

equals和hashCode概念

1、equals 比较的是对象的引用是否相等,即比较两个对象是否是同一个实例。

2、hashcode (哈希码)是一个整数值,它是根据对象的内容计算得出的。在Java中,哈希码主要用于散列数据结构,如哈希表。哈希表是一种常用的数据结构,它可以快速查找存储在其中的对象。哈希码可以帮助我们确定对象在哈希表中的存储位置,从而实现高效的查找操作。

重写equals和hashCode

1、未重写equals方法

默认情况下,Java中的 equals 方法比较的是对象的引用。如果我们不重写 equals 方法,那么对于两个不同的对象,即使它们的内容相同,调用 equals 方法也会返回 false,因为它们的引用不同。

public class Point {
    private final int x, y;

    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public static void main(String[] args) {
        Point p1 = new Point(1, 2);
        Point p2 = new Point(1, 2);
        System.out.println(p1.equals(p2));// false
    }
}

2、重写equals方法

class Point1 {
    private final int x, y;

    public Point1(int x, int y) {
        this.x = x;
        this.y = y;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (!(obj instanceof Point1)) return false;
        Point1 point = (Point1) obj;
        return x == point.x && y == point.y;
    }

    public static void main(String[] args) {
        Point1 p1 = new Point1(1, 2);
        Point1 p2 = new Point1(1, 2);
        System.out.println(p1.equals(p2));// true

        Map<Point1, String> map = new HashMap<>();
        map.put(p1, \"p1\");
        System.out.println(map.get(p1)); // p1
        System.out.println(map.get(p2)); // null
    }
}

3、重写equals+hashcode方法

在Java中,哈希表使用哈希码来确定存储对象的位置。如果两个相等的对象具有不同的哈希码,那么它们将被存储在哈希表的不同位置,导致无法正确查找这些对象。

需要确保重写 equals 方法的对象也必须重写 hashCode 方法,以便它们的哈希码是相等的。这样,哈希表就能够正确地存储和查找这些对象了。

class Point2 {
    private final int x, y;

    public Point2(int x, int y) {
        this.x = x;
        this.y = y;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (!(obj instanceof Point2)) return false;
        Point2 point = (Point2) obj;
        return x == point.x && y == point.y;
    }

    @Override
    public int hashCode() {
//          方式一
//        int result = Integer.hashCode(x);
//        result = 31 * result + Integer.hashCode(y);
//        return result;

//          方式二
//        Objects 类有一个静态方法,它接受任意数量的对象并为它们返回一个哈希码。
//        这个名为 hash 的方法可以 让你编写一行 hashCode 方法,其质量与根据这个项目中的上面编写的方法相当。
        return Objects.hash(x, y);
    }

    public static void main(String[] args) {
        Point2 p1 = new Point2(1, 2);
        Point2 p2 = new Point2(1, 2);
        System.out.println(p1.equals(p2));// true

        Map<Point2, String> map = new HashMap<>();
        map.put(p1, \"p1\");
//        map.put(p2, \"p2\");
        System.out.println(map.get(p1)); // p1
        System.out.println(map.get(p2)); // p1
    }
}

总结

最后总结下equals和hashcode的关系与区别

equals方法

  • equals方法是用来比较两个对象的内容是否相等的方法。
  • 如果两个对象是同一个实例(即它们在内存中的位置是相同的),那么equals方法返回true
  • 如果两个对象是不同的实例,但它们的内容相同(例如两个都是5的整数对象),那么equals方法也应该返回true
  • 如果两个对象既不是同一个实例,内容也不相同,那么equals方法返回false
  • 默认情况下,Java对象的equals方法只检查两个对象是否是同一个实例。但许多类(如String、Integer等)重写了这个方法,使其能够基于对象的内容进行比较。

hashCode方法

  • hashCode方法返回一个整数,这个整数是基于对象的内容计算得出的。
  • 对于两个相等的对象(根据equals方法),它们的hashCode值也必须相同。
  • 但反过来则不必然,即两个对象的hashCode相同,并不意味着这两个对象是相等的。
  • 在Java的集合类(如HashSet、HashMap等)中,hashCode方法用于确定对象在集合中的位置。如果两个对象的hashCode不同,即使它们根据equals方法是相等的,它们也会被视为不同的对象。
  • 通常,当我们重写equals方法时,也需要重写hashCode方法,以确保两个相等的对象具有相同的哈希码。

以上就是关于Java 重写equals、hashcode比较两个对象是否相等相关的全部内容,希望对你有帮助。欢迎继续关注潘子夜个人博客,学习愉快哦!

微信扫一扫

支付宝扫一扫

版权: 转载请注明出处:https://www.zuozi.net/10122.html

管理员

相关推荐
2025-08-06

文章目录 一、Reader 接口概述 1.1 什么是 Reader 接口? 1.2 Reader 与 InputStream 的区别 1.3 …

988
2025-08-06

文章目录 一、事件溯源 (一)核心概念 (二)Kafka与Golang的优势 (三)完整代码实现 二、命令…

465
2025-08-06

文章目录 一、证明GC期间执行native函数的线程仍在运行 二、native线程操作Java对象的影响及处理方…

348
2025-08-06

文章目录 一、事务基础概念 二、MyBatis事务管理机制 (一)JDBC原生事务管理(JdbcTransaction)…

456
2025-08-06

文章目录 一、SnowFlake算法核心原理 二、SnowFlake算法工作流程详解 三、SnowFlake算法的Java代码…

517
2025-08-06

文章目录 一、本地Jar包的加载操作 二、本地Class的加载方法 三、远程Jar包的加载方式 你知道Groo…

832
发表评论
暂无评论

还没有评论呢,快来抢沙发~

助力内容变现

将您的收入提升到一个新的水平

点击联系客服

在线时间:08:00-23:00

客服QQ

122325244

客服电话

400-888-8888

客服邮箱

122325244@qq.com

扫描二维码

关注微信客服号