Première approche
Comme l'a dit Guillaume Lours, pour simplifier, == vaut VRAI si les 2 objets sont les mêmes, et equals() vaut VRAI si les 2 objets ont un contenu équivalent.Illustration
Si je crée une classe User, ainsi que 2 instances de cette classe, le == entre ces 2 objets seraFAUX:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package xnopre.javasamples; | |
class User { | |
private final String login; | |
private final int month; | |
User(String login, int month) { | |
this.login = login; | |
this.month = month; | |
} | |
public static void main(String[] args) { | |
User xavier1 = new User("Xavier", 7); | |
User xavier2 = new User("Xavier", 7); | |
System.out.println(xavier1 == xavier2); // false | |
System.out.println(xavier1.equals(xavier2)); // false | |
} | |
} |
Exemple :
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package xnopre.javasamples; | |
class UserWithEquals { | |
private final String login; | |
private final int month; | |
UserWithEquals(String login, int month) { | |
this.login = login; | |
this.month = month; | |
} | |
@Override | |
public boolean equals(Object obj) { | |
if (this == obj) { | |
return true; | |
} | |
if (obj == null) { | |
return false; | |
} | |
if (getClass() != obj.getClass()) { | |
return false; | |
} | |
UserWithEquals other = (UserWithEquals) obj; | |
return login.equals(other.login) && month == other.month; | |
} | |
public static void main(String[] args) { | |
UserWithEquals xavier1 = new UserWithEquals("Xavier", 7); | |
UserWithEquals xavier2 = new UserWithEquals("Xavier", 7); | |
System.out.println(xavier1 == xavier2); // false | |
System.out.println(xavier1.equals(xavier2)); // true | |
} | |
} |
Cas des objets primitifs : String
En Java, la gestion des objets primitifs (String, Boolean, Integer, Double, ...) est particulière. Ainsi, pour les objets String, Java a une procédure spéciale pour l'instanciation par "", et les instances créées par 2 chaines de caractères identiques (ex : "toto") sont des instances identiques, donc == vaut VRAI. Java gère une sorte de pool d'objets selon leurs contenus.Par contre, lors d'une instanciation explicite new String("toto"), l'objet créé est nouveau, spécifique, donc == vaudra FAUX.
Merci Xavier. Tu nous fais un petit article sur les subtilités du equals et du compareTo qui renvoie zéro ? ;-)
RépondreSupprimerAh oui, de beau souvenirs .... :-(
RépondreSupprimerPour ceux à qui ça pourrait servir, dans les très grandes lignes : dans le cas où votre classe implémente Comparable, si compareTo() renvoie 0, il faut que equals() renvoie TRUE. La JavaDoc dit que ça n'est pas obligatoire, que la classe peut avoir un ordre implicite sans effet sur equals(). Dans la pratique, je sous suggère de suivre la consigne pour éviter les problèmes dans les Map et autre Set ...
je veux votre aide SVP : voila je suis debutant et je sais pas comment faire cet exercice. voila l'ennoncé :
RépondreSupprimerpublic class Etudiant{
String nom; String prenoms; double moyenneGen;
String mention;
Etuduiant(String n, String pr, double moyenneGen){
nom=n; prenoms=pr; moyenneGen=moyG; mention=mt;
}
String nomEtudiant(){ return(nom);}
}
-Ajoutez un accesseur pour la variable moyenneGen et la variable mention.
-Ajoutez une méthode main() permettant de créer deux étudiants et faire afficher leurs coordonnées.
merci
Salut,
SupprimerLaisse moi tes coordonnées en cliquant sur "Contactez-moi" sur la droite du blog.
Xavier
Merci monsieur, ça m'a bien aidée.
RépondreSupprimerje veux comparer 2 objets avec < et/ou > est-il possible ???
RépondreSupprimersi non que dois-je jaire !!!
Bonjour,
SupprimerPourquoi voulez-vous comparer vos objets avec < ou > ? Que contiennent vos objets ? Auriez-vous un exemple ?
RépondreSupprimersi vous pouvez maidez a resoudre cette exercice svp
Soit le programme source suivant représentant la classe Etudiant. Dans cette classe, on définit les attributs nom, prenoms, MoyG et mention.
public class Etudiant { String nom; String prenoms; double MoyG; String mention;}
a) Ajouter un constructeur de la classe Etudiant.
b) Ajouter à la classe Etudiant la méthode affiche, de type de retour void, qui affiche à l’écran le nom et prenoms d’un objet Etudiant.
c) Ajoutez un accesseur pour chacun des attributs de la classe Etudiant.
d) Ajoutez une méthode main ( ) pour créer 3 objets Etudiant et utiliser la méthode affiche.