Java 重写equals和hashcode比较两个对象是否相等

后端 潘老师 2个月前 (12-19) 49 ℃ (0) 扫码查看

本文主要讲解关于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.panziye.com/back/12656.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】