Méthode equals et hashCode

Lorsqu’un on définit un bean dans une application Java, il est courant de surcharger les 2 méthodes equals et hashCode hérité de Object mais à quoi servent-elles ?

Méthode equals

La méthode equals permet à Java de comparer deux objets et de déterminer l’égalité entre ces deux objets, ce qui parait logique. En revanche, beaucoup de personnes oublient que cette méthode est utilisée par la plupart des listes (List, Collection, Vector) pour déterminer la présence ou non d’un objet dans une liste. Cette méthode peut donc être appelée sur chaque élément d’une liste. Il faut donc qu’elle soit optimisé afin d’éviter des problèmes de performance.

Par défaut, la méthode retourne vrai s’il s’agit du même objet en mémoire. Par conséquent, si deux objets distincts instancié à partir de la classe Personne ont tout les deux le même id, nom, prénom et date de naissance, la méthode ne retourne pas vrai mais faux, car il s’agit de deux objets distincts en mémoire, c’est pourquoi il faut parfois la surcharger.

Dans l’exemple ci-dessous, nous utilisons l’id pour comparer un objet à un autre.

@Override
	public boolean equals(Object o) {
		if (o == this) {
			return true;
		}

		if (o instanceof Personne) {
			return (this.getId() == ((Personne) o).getId());
		} else {
			return false;
		}
	}

Méthode hashCode

La méthode hashCode est utilisée par les listes pour optimiser leurs objets et les classer selon la valeur du HashCode retourné. Il est important de toujours redéfinir la méthode hashCode en même temps que la méthode equals et respecter la règle suivante : Si la méthode equals retourne vrai pour la comparaison entre 2 objets, alors la méthode hashCode executé sur les 2 objets doit retourner la même valeur.

@Override
public int hashCode() {
		return getId();
}

2 réflexions au sujet de « Méthode equals et hashCode »

  1. Bonjour, Il manque la fin du paragraphe concernant la méthode hashCode. C’est dommage, c’est la partie intéressante =P Merci pour votre travail !

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *