new Point().equals(new Point())
qui compare deux instances différentes, retourne false. Il est donc utile de redéfinir equals. Dans le cas de la classe Point, un point est égal à un objet o si o est un point et si les champs correspondants sont égaux. L'expression o instanceof Point, de type boolean, permet de tester si le type de l'objet désigné par o est un sous-type de Point :
package geometrie; class Point { // ... public boolean equals(Object o) { return o instanceof Point && this.x == ((Point)o).x && this.y == ((Point)o).y; } }
Il serait tentant de définir une méthode qui compare seulement des instances de Point entre elles :
class Point { // ... boolean equals(Point p) { ... } }
Cependant, ce ne serait pas une redéfinition de la méthode equals de la classe Object, car elle n'a pas le même profil, donc le mécanisme de liaison tardive ne l'invoquera pas. Dans la situation suivante, l'égalité des deux points serait donc testée à l'aide de l'equals d'Object et non par celle de Point :
Object o = new Point(), p = new Point(1, 2); boolean b = o.equals(p);
D'autre part, toute classe qui redéfinit equals doit aussi redéfinir hashCode ; en effet, deux objets égaux par equals doivent avoir la même valeur de hachage par hashCode, ce qui est requis s'ils doivent être ajoutés à une table de hachage (voir § 6.4). En voici une définition possible :
public int hashCode() { long bits = Double.doubleToLongBits(this.x); bits ^= Double.doubleToLongBits(this.y) * 31; return (int) bits ^ (int) (bits >> 32); }