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
实现中是很奇怪的--我承认我在吹毛求疵。。。