samedi 17 novembre 2012

[Java] Différences entre == et equals()

Suite à une question de Jérôme Avoustin sur Twitter, quelques éléments de réponses ...

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 sera
FAUX:

Pour que equals() soit VRAI si les contenus sont les mêmes, je dois implémenter moi-même cette méthode, en y comparant tous les attributs de mon objet. En effet, par défaut, dans Object (la super classe de tous les objets Java), la méthode equals() fait un ==

Exemple :


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.


Conclusion

Toujours bien utiliser equals() et l'implémenter (et le maintenir) pour tous nos objets !

8 commentaires:

  1. Merci Xavier. Tu nous fais un petit article sur les subtilités du equals et du compareTo qui renvoie zéro ? ;-)

    RépondreSupprimer
  2. Ah oui, de beau souvenirs .... :-(

    Pour 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 ...

    RépondreSupprimer
  3. je veux votre aide SVP : voila je suis debutant et je sais pas comment faire cet exercice. voila l'ennoncé :

    public 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

    RépondreSupprimer
    Réponses
    1. Salut,

      Laisse moi tes coordonnées en cliquant sur "Contactez-moi" sur la droite du blog.

      Xavier

      Supprimer
  4. Merci monsieur, ça m'a bien aidée.

    RépondreSupprimer
  5. je veux comparer 2 objets avec < et/ou > est-il possible ???
    si non que dois-je jaire !!!

    RépondreSupprimer
    Réponses
    1. Bonjour,
      Pourquoi voulez-vous comparer vos objets avec < ou > ? Que contiennent vos objets ? Auriez-vous un exemple ?

      Supprimer




  6. si 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.

    RépondreSupprimer