考虑将相等方法添加到以下简单点类中:
public class Point {
private final int x;
private final int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
// ...
}
//我对等值的定义
public boolean equals(Point other) {
return (this.getX() == other.getX() && this.getY() == other.getY());
}
这种方法有什么问题?乍一看,它似乎可以正常工作:
Point p1 = new Point(1, 2);
Point p2 = new Point(1, 2);
Point q = new Point(2, 3);
System.out.println(p1.equals(p2)); // prints true
System.out.println(p1.equals(q)); // prints false
但是,一旦开始将点放入集合中,麻烦就开始了:
import java.util.HashSet;
HashSet<Point> coll = new HashSet<Point>();
coll.add(p1);
System.out.println(coll.contains(p2)); // prints false
即使coll已添加p1,并且p1和p2是相等的对象,怎么可能不包含coll呢?
的确,hashCode()
当您实施时应该实施equals()
,但这不会引起问题。
那不是equals()
您要寻找的方法。equals方法必须始终具有以下签名:“ public boolean equals(Object object)”。这是一些代码。
public boolean equals(Object object)
{
if (object == null)
{
return false;
}
if (this == object)
{
return true;
}
if (object instanceof Point)
{
Point point = (Point)object;
... now do the comparison.
}
else
{
return false;
}
}
该阿帕奇EqualsBuilder类是平等的实现是有用的。该链接是较旧的版本,但仍然适用。
如果您喜欢Apache EqualsBuilder,那么您可能也会喜欢Apache HashCodeBuilder类。
编辑:更新了标准快捷方式的equals方法示例。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句