Java比较了两组填充了满足()的同一对象的不同实例



我已经完成了一个称为坐标的类,如下所示:

public class Coordinate {
    public int x;
    public int y;
    public Coordinate(int x, int y) {
        this.x = x;
        this.y = y;
    }
    @Override
    public boolean equals(Object obj) {
        Coordinate coordinate = (Coordinate)obj;
        return (coordinate.x == this.x && coordinate.y == this.y);
    }
}

我有两组(a& b),我填充了坐标类的实例。我想测试我的两组是否包含满足.equals()的坐标实例。例如:

Coordinate a = new Coordinate(2, 2);
Coordinate b = new Coordinate(2, 2);
A.add(a);
B.add(b);

即使A. equals(b)和B. Equals(a)均评估为true,但A和B是不同的实例(因此分配给不同的内存位置),因此每个Mathod比较了集合A和B我遇到的B将将它们评估为不同的集合。

是否有一种方法可以根据其内容是否满意。equals()?

如果您的SetHashSet s,则忘记在Coordinate类中覆盖hashCode()hashCode()的合同要求,如果a.equals(b)为真,则a.hashCode() == b.hashCode()也必须为真。

正确覆盖hashCode()将导致A.equals(B)返回true,因为Set的CC_11返回true如果:

这两个集合具有相同的大小,并且指定集的每个成员都包含在此组中(或等效地,该集合的每个成员都包含在指定的集合中)。

一种可能的实现:

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

生成hashcode并等于方法

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + x;
    result = prime * result + y;
    return result;
}
@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Coordinate other = (Coordinate) obj;
    if (x != other.x)
        return false;
    if (y != other.y)
        return false;
    return true;
}

最新更新