Вы должны переопределить методы equals
и hashCode
для своего пользовательского типа.
Будьте осторожны, вы можете попасть во все виды дерьма здесь: например, если у вас есть подтипы для вашего пользовательского типа, вы можете столкнуться с другими проблемами равенства:
class Point {
final int x;
final int y;
public Point(int x, int y) {
this.x= x;
this.y = y;
}
@Override
public boolean equals(Object o) {
if (o == this) return true; //If objects equal, is OK
if (o instanceof Point) {
Point that = (Point)o;
return (x == that.x) && y == that.y);
}
return false;
}
}
class ColoredPoint extends Point {
final Color color;
ColoredPoint(int x, int y, Color color) {
super(x, y);
this.color = color
}
}
Point p1 = new Point(1, 2);
ColoredPoint cp1 = new ColoredPoint(1, 2, Color.BLUE);
ColoredPoint cp1 = new ColoredPoint(1, 2, Color.RED);
В нынешнем виде p1, cp1 и cp2 все равны. Однако очевидно, что cp1 и cp2 не равны. Вам также нужно будет реализовать равенство в ColoredPoint для сравнения объектов ColoredPoint (но это нарушает равенство между p1 и cp1 или cp2).
Также убедитесь, что у ваших равных есть подпись выше. Распространенной ошибкой является определение его как public equals(Point that)...
, что неверно.
См. http://www.artima.com/lejava/articles/equality.html для полного объяснения правил для equals и hashCode