IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Boxing, ==, et méthode .equals()


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti Avatar de ssoltani
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2011
    Messages : 28
    Par défaut Boxing, ==, et méthode .equals()
    Bonjour à tous,

    Il y'a quelque chose que je ne comprends pas dans le langage java, qui est en rapport avec les wrapper classes.

    Prenons un exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Integer i1 = new Integer("20");
    Integer i2 = new Integer("20");
    A ce stade nous avons deux objets wrapper classes qui permet d'utiliser la méthode .equals

    Lorsqu'on fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (i1!=i2){Afficher "pasdecoucou"}else{ Afficher "coucou" }
    ça affiche "pascoucou" ce qui est normal car même si ce sont deux objets qui ont la même valeur, ce sont quand même deux objets différents dans le "heap".

    Par contre si je fais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (i1==i2){Afficher "cestegale"}else{ Afficher "cestpasegale" }
    Dans ce cas là, j'ai bien "cestegale" qui saffiche.

    Le .equals fonctionne aussi, mais cela est normal puisqu'il compare les valeurs et non l'objet lui même
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (i1.equals(i2)){Afficher "EGALE"}else{ Afficher "NONEGALE" }
    Je ne comprends pas ... pouvez vous m'expliquer ?

    Merci d'avance.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    333
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 333
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    public class TT {
     
    	/**
             * @param args
             */
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
     
    		Integer i1 = new Integer("20");
    		Integer i2 = new Integer("20");
     
    		if (i1 != i2) {
    			System.out.println("diff !=");
    		} else {
    			System.out.println("egal !=");
    		}
     
    		if (i1 == i2) {
    			System.out.println("egal ==");
    		} else {
    			System.out.println("diff ==");
    		}
     
    		if (i1.equals(i2)) {
    			System.out.println("egal equals");
    		} else {
    			System.out.println("diff equals");
    		}
     
    	}
     
    }
    diff !=
    diff ==
    egal equals
    J'obtiens ça.
    Tu es sur de ta méthode Afficher?

  3. #3
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par ssoltani Voir le message
    Par contre si je fais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (i1==i2){Afficher "cestegale"}else{ Afficher "cestpasegale" }
    Dans ce cas là, j'ai bien "cestegale" qui saffiche.
    Non.

    Si tu fais new Integer(20) sur i1 et sur i2 qui sont tous les deux de type Integer, l'opérateur new garantit que ce seront deux objets distincts et que la comparaison == dira qu'ils sont différents.

    Par contre, si tu fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Integer i1 = 20;
    Integer i2 = 20;
    Là c'est une autre histoire. Les objets ne seront pas distinct, ce sera bel et bien un seul objet Integer de valeur 20. Mais là tu n'as jamais demandé à avoir deux objets distincts. Dis-toi que puisque tu n'as rien demandé, Java "fait ce qu'il veut."

    De toute façon, les opérateurs == et != sont cohérents l'un avec l'autre. Si tu crois qu'ils ne le sont pas, tu te trompes quelque part.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre Expert
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Par défaut
    l'introduction (tardive) des opérations de "boxing" dans java a conduit à des specifications qui introduisent de nombreuses asymétries.
    Integer.valueOf(int x) est une fabrique qui garantit l'unicité d'un certain nombres de valeurs.
    pour rigoler un peu fait un test avec 20 puis avec 1000 dans un cas == marche mais pas dans l'autre: c'est écrit dans les specs!
    Il y a d'autres anomalies de ce type et il faut donc faire attention avec le boxing : c'est pratique mais à utiliser avec discernement.

Discussions similaires

  1. la méthode equals()
    Par slim_java dans le forum Débuter avec Java
    Réponses: 7
    Dernier message: 23/09/2009, 09h00
  2. méthode equals() explications
    Par kimlaw95 dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 11/05/2009, 17h21
  3. Méthode "equals" dans une liste.
    Par c-ve dans le forum Langage
    Réponses: 5
    Dernier message: 04/03/2009, 14h39
  4. Réponses: 0
    Dernier message: 26/11/2007, 15h47
  5. La méthode equals() de la classe String
    Par Nayila dans le forum Langage
    Réponses: 5
    Dernier message: 31/10/2007, 13h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo