Java比较两个集合,其中包含满足equals()的同一对象的不同实例

Java比较两个集合,其中包含满足equals()的同一对象的不同实例,java,equals,hashset,Java,Equals,Hashset,我创建了一个名为坐标的类,如下所示: 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

我创建了一个名为坐标的类,如下所示:

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是不同的实例(因此被分配到不同的内存位置),因此我遇到的每种比较集合a和集合b的方法都会将它们作为不同的集合进行计算


有没有一种方法可以根据集合的内容是否满足.equals(),来评估集合是否相等?

如果您的
Set
s是
HashSet
s,那么您忘了在
Coordinate
类中重写
hashCode()
hashCode()
的契约要求,如果
a.equals(b)
为真,
a.hashCode()==b.hashCode()
也必须为真

正确重写
hashCode()
将导致
A.equals(B)
返回true,因为
Set的
equals
在以下情况下返回true:

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

一种可能的实施方式:

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

生成hashCode和equals方法

@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;
}

虽然实现
hashCode()
是有意义的,但我认为
HashSet
有点不符合
Set.equals()
-不需要哈希代码匹配的契约。要测试不一致性,请尝试
Set a=new TreeSet();Set B=新的HashSet()
A.equals(B)
返回
true
,而
B.equals(A)
返回
false
@ernest\k在
对象
类中定义的
hashCode
的基本约定要求它匹配
equals
的实现。如果您遵守该合同,
HashSet
s将正常运行。毫无疑问,您同意这一点。但我只是认为
HashSet
在这里的
Set
实现中是很奇怪的--我承认我在吹毛求疵。。。