La méthode equals
en Java est une fonction essentielle utilisée pour comparer deux objets afin de déterminer s’ils sont structurellement égaux ou non. Dans cet article, nous allons plonger dans les détails de cette fonction clé, en expliquant son fonctionnement, son importance et les bonnes pratiques pour l’implémenter correctement.
equals
La méthode equals
est héritée de la classe Object
et est utilisée pour comparer le contenu de deux objets pour l’égalité. Voici sa signature :
public boolean equals(Object obj)
Lorsque vous appelez equals
sur un objet, vous fournissez en paramètre l’objet avec lequel vous souhaitez le comparer. La méthode retourne true
si les deux objets sont considérés comme égaux et false
sinon.
Par défaut, la méthode equals
de la classe Object
compare les références mémoire des deux objets, ce qui signifie qu’elle retournera true
uniquement si les deux références pointent vers la même adresse mémoire. Cependant, dans de nombreux cas, vous voudrez comparer les valeurs des attributs des objets plutôt que leurs adresses mémoire.
equals
Pour effectuer une comparaison basée sur le contenu des objets, vous devez souvent surcharger la méthode equals
dans vos propres classes. Voici un exemple d’implémentation simple pour une classe Personne
:
public class Personne {
private String nom;
private int age;
// Constructeur, getters, setters
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
Personne personne = (Personne) obj;
return age == personne.age &&
Objects.equals(nom, personne.nom);
}
}
Dans cette implémentation, nous comparons d’abord les références mémoire pour vérifier si les objets sont les mêmes. Ensuite, nous vérifions si l’objet passé en paramètre est null ou s’il n’est pas une instance de la classe Personne
. Enfin, nous comparons les attributs nom
et age
pour déterminer l’égalité.
equals
Lors de l’écriture de votre propre méthode equals
, voici quelques bonnes pratiques à garder à l’esprit :
a.equals(b)
retourne true
, alors b.equals(a)
doit également retourner true
.a.equals(a)
doit toujours retourner true
.a.equals(b)
et b.equals(c)
sont tous deux true
, alors a.equals(c)
doit également être true
.equals
sur les mêmes objets doit toujours retourner la même valeur, à moins que l’un des objets ne soit modifié.equals
doit retourner false
si l’objet passé en paramètre est null
.equals
en Java Supposons que nous ayons une classe Point
représentant des coordonnées x et y. Nous voulons comparer deux points pour déterminer s’ils sont égaux en fonction de leurs coordonnées.
public class Point {
private int x;
private int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
Point point = (Point) obj;
return x == point.x && y == point.y;
}
public static void main(String[] args) {
Point p1 = new Point(1, 2);
Point p2 = new Point(1, 2);
System.out.println("Les points sont-ils égaux ? " + p1.equals(p2)); // true
}
}
Supposons que nous ayons une classe Personne
avec un nom et un âge, et une classe Employe
qui étend Personne
et ajoute un identifiant d’employé. Nous voulons comparer des employés en fonction de leur nom, âge et identifiant.
public class Personne {
private String nom;
private int age;
public Personne(String nom, int age) {
this.nom = nom;
this.age = age;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
Personne personne = (Personne) obj;
return age == personne.age &&
Objects.equals(nom, personne.nom);
}
}
public class Employe extends Personne {
private int id;
public Employe(String nom, int age, int id) {
super(nom, age);
this.id = id;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
if (!super.equals(obj)) {
return false;
}
Employe employe = (Employe) obj;
return id == employe.id;
}
public static void main(String[] args) {
Employe e1 = new Employe("Alice", 30, 1001);
Employe e2 = new Employe("Alice", 30, 1002);
System.out.println("Les employés sont-ils égaux ? " + e1.equals(e2)); // false
}
}
Ces exemples illustrent comment utiliser la méthode equals
pour comparer des objets en Java en fonction de différents critères.
⭐ Cas pratiques ⭐ avec des exemples de code pour illustrer l’utilisation de la méthode equals
en Java :
String str1 = "hello";
String str2 = "hello";
System.out.println(str1.equals(str2)); // true
Dans cet exemple, la méthode equals
est utilisée pour comparer deux chaînes de caractères. Elle retourne true
car les deux chaînes contiennent la même séquence de caractères.
List<Integer> list1 = new ArrayList<>(Arrays.asList(1, 2, 3));
List<Integer> list2 = new ArrayList<>(Arrays.asList(1, 2, 3));
System.out.println(list1.equals(list2)); // true
Ici, la méthode equals
est utilisée pour comparer deux listes d’entiers. Elle retourne true
car les deux listes ont les mêmes éléments dans le même ordre.
LocalDate date1 = LocalDate.of(2022, Month.JANUARY, 1);
LocalDate date2 = LocalDate.of(2022, Month.JANUARY, 1);
System.out.println(date1.equals(date2)); // true
Dans cet exemple, la méthode equals
est utilisée pour comparer deux dates. Elle retourne true
car les deux dates représentent le même jour.
public class Personne {
private String nom;
private int age;
// Constructeur, getters, setters, etc.
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
Personne personne = (Personne) obj;
return age == personne.age &&
Objects.equals(nom, personne.nom);
}
public static void main(String[] args) {
Personne p1 = new Personne("Alice", 30);
Personne p2 = new Personne("Alice", 30);
System.out.println(p1.equals(p2)); // true
}
}
Dans ce cas, la méthode equals
est utilisée pour comparer deux objets de la classe Personne
. Elle retourne true
car les deux objets ont les mêmes valeurs pour les attributs nom
et age
.
Ces exemples montrent comment la méthode equals
peut être utilisée dans différents contextes pour comparer des objets en Java.
Éviter les pièges : Bonnes et mauvaises pratiques de l’implémentation de la méthode equals en Java
Voici quelques erreurs courantes à éviter lors de l’implémentation de la méthode equals
en Java, ainsi que des exemples de bon et de mauvais code pour illustrer chaque erreur :
Mauvais code :
public class Personne {
private String nom;
private int age;
// Constructeur, getters, setters, etc.
@Override
public boolean equals(Object obj) {
return this == obj; // Comparaison des références
}
}
Explication : Ce code compare les références mémoire des objets au lieu de leurs valeurs. Cela signifie que deux objets avec les mêmes valeurs pour les attributs nom
et age
seront considérés comme différents s’ils ne partagent pas la même référence mémoire.
Bon code :
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
Personne personne = (Personne) obj;
return age == personne.age &&
Objects.equals(nom, personne.nom);
}
Mauvais code :
@Override
public boolean equals(Object obj) {
Personne personne = (Personne) obj; // Pas de vérification du type
return age == personne.age &&
Objects.equals(nom, personne.nom);
}
Explication : Ce code suppose que l’objet passé en paramètre est toujours une instance de la classe Personne
, ce qui peut entraîner une ClassCastException
si ce n’est pas le cas.
Bon code :
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
Personne personne = (Personne) obj;
return age == personne.age &&
Objects.equals(nom, personne.nom);
}
Mauvais code :
@Override
public boolean equals(Object obj) {
Personne personne = (Personne) obj;
return age == personne.age; // Oubli de comparer le nom
}
Explication : Ce code ne compare que l’attribut age
et ignore l’attribut nom
, ce qui peut conduire à des résultats incorrects lors de la comparaison des objets.
Bon code :
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
Personne personne = (Personne) obj;
return age == personne.age &&
Objects.equals(nom, personne.nom);
}
En évitant ces erreurs courantes, vous pouvez garantir une implémentation correcte et fiable de la méthode equals
dans vos classes Java.
Voici quelques erreurs courantes à éviter lors de l’implémentation de la méthode equals
en Java, ainsi que des exemples de bon et de mauvais code pour illustrer chaque erreur :
Mauvais code :
public class Personne {
private String nom;
private int age;
// Constructeur, getters, setters, etc.
@Override
public boolean equals(Object obj) {
return this == obj; // Comparaison des références
}
}
Explication : Ce code compare les références mémoire des objets au lieu de leurs valeurs. Cela signifie que deux objets avec les mêmes valeurs pour les attributs nom
et age
seront considérés comme différents s’ils ne partagent pas la même référence mémoire.
Bon code :
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
Personne personne = (Personne) obj;
return age == personne.age &&
Objects.equals(nom, personne.nom);
}
Mauvais code :
@Override
public boolean equals(Object obj) {
Personne personne = (Personne) obj; // Pas de vérification du type
return age == personne.age &&
Objects.equals(nom, personne.nom);
}
Explication : Ce code suppose que l’objet passé en paramètre est toujours une instance de la classe Personne
, ce qui peut entraîner une ClassCastException
si ce n’est pas le cas.
Bon code :
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
Personne personne = (Personne) obj;
return age == personne.age &&
Objects.equals(nom, personne.nom);
}
Mauvais code :
@Override
public boolean equals(Object obj) {
Personne personne = (Personne) obj;
return age == personne.age; // Oubli de comparer le nom
}
Explication : Ce code ne compare que l’attribut age
et ignore l’attribut nom
, ce qui peut conduire à des résultats incorrects lors de la comparaison des objets.
Bon code :
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
Personne personne = (Personne) obj;
return age == personne.age &&
Objects.equals(nom, personne.nom);
}
En évitant ces erreurs courantes, vous pouvez garantir une implémentation correcte et fiable de la méthode equals
dans vos classes Java.
Voici une série d’exercices conçus pour perfectionner vos compétences Excel. Les corrigés sont inclus pour…
Excel offre plusieurs méthodes pour calculer une moyenne tout en tenant compte des filtres ou…
Excel propose plusieurs fonctions pour insérer ou manipuler la date actuelle. Voici les principales méthodes…
Lorsque des nombres sont stockés sous forme de texte dans Excel, ils ne peuvent pas…
Extraire uniquement les chiffres d'une cellule contenant du texte et des nombres mélangés est une…
Pour supprimer plusieurs caractères spécifiques (par exemple, des symboles, chiffres ou lettres indésirables) dans des…
This website uses cookies.