文
章
目
录
章
目
录
本文主要讲解关于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比较两个对象是否相等相关的全部内容,希望对你有帮助。欢迎继续关注潘子夜个人博客,学习愉快哦!