我已经完成了一个称为坐标的类,如下所示:
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()?
如果您的Set
是HashSet
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;
}