【问题标题】:How to make two objects equal in contains method of Hashset [duplicate]如何在Hashset的包含方法中使两个对象相等[重复]
【发布时间】:2022-01-07 04:04:40
【问题描述】:

我创建了一个 Pair 类,它有下面提到的 3 个变量,并覆盖了 equals 方法,假设它用于 hashset 的 contains 方法。但事实并非如此。有人可以解释在 Pair 类中实现什么以确保它仅等于 x 和 y 的值。

Class Pair extends Object {
int x;
int y;
int dis;
   public Pair(int x, int y, int d) {
    this.x = x;
    this.y = y;
    this.dis = d;
   }
  @override
  public boolean equals(Pair p) {
  return this.x == p.x && this.y == p.y
  }
}

【问题讨论】:

  • 覆盖hashCode()方法

标签: java contains hashset


【解决方案1】:

当你覆盖equals时,你也应该覆盖hashCode

@Override
public int hashCode() {
    return Objects.hash(x,y);
}

equalshashCode的总合同: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Object.html

【讨论】:

    【解决方案2】:

    equals 方法被重写时,一般需要重写hashCode 方法,以维护 hashCode 方法的一般约定,即相等的对象必须具有相等的哈希码。

    import java.util.HashSet;
    
    class Point extends Object {
        int x, y, dis;
    
        Point(int x, int y) {
            this.x = x;
            this.y = y;
            this.dis = (int) Math.sqrt(x * x + y * y);
        }
    
        @Override
        public boolean equals(Object o) {
            if (o instanceof Point) {
                Point p = (Point) o;
                return p.x == x && p.y == y;
            }
            return false;
        }
    
        @Override
        public int hashCode() {
            return Objects.hash(x, y);
        }
    }
    
    public class Equals {
        public static void main(String[] args) {
            HashSet<Point> set = new HashSet<Point>();
            set.add(new Point(1, 2));
            set.add(new Point(1, 2));
            set.add(new Point(1, 3));
            System.out.println(set.size());
        }
    }
    

    参见equals API 文档。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-27
      • 2020-03-30
      • 2015-01-18
      • 1970-01-01
      • 2015-01-30
      • 1970-01-01
      相关资源
      最近更新 更多