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

avec Java Discussion :

Comportement que je comprends pas


Sujet :

avec Java

  1. #1
    Futur Membre du Club
    Inscrit en
    Janvier 2011
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 3
    Points : 5
    Points
    5
    Par défaut Comportement que je comprends pas
    Bonjour,

    Je ne comprend pas pourquoi si
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    String a = new String("toto");
    String b = new String("toto");
    a == b n'est pas vrai .... Pourtant toto c'est toto ...

    Alors que si
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int a = 0;
    int b = 0;
    Alors là, a == 0 est vrai ... Normal 0 c'est 0

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2010
    Messages : 129
    Points : 84
    Points
    84
    Par défaut
    Citation Envoyé par elvorpholif Voir le message
    Bonjour,

    Je ne comprend pas pourquoi si
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    String a = new String("toto");
    String b = new String("toto");
    a == b n'est pas vrai .... Pourtant toto c'est toto ...

    Alors que si
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int a = 0;
    int b = 0;
    Alors là, a == 0 est vrai ... Normal 0 c'est 0
    En java, on compare pas deux String avec "==" mais avec des fonctions
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    String a,b;
    a = "toto";
    b = "toto";
    if(a.equals(b))
         System.out.println("a et b sont égaux !");
    Donc toujours pour les String, il faut utiliser les fonctions.

    Pour les entiers(int), double... on utilisent les "=="

  3. #3
    Expert éminent sénior
    Avatar de Marco46
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2005
    Messages : 4 413
    Points : 19 609
    Points
    19 609
    Par défaut
    Citation Envoyé par seanbean Voir le message
    En java, on compare pas deux String avec "==" mais avec des fonctions
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    String a,b;
    a = "toto";
    b = "toto";
    if(a.equals(b))
         System.out.println("a et b sont égaux !");
    Donc toujours pour les String, il faut utiliser les fonctions.

    Pour les entiers(int), double... on utilisent les "=="
    Faudrait lui expliquer le pourquoi du comment.

    Un String c'est une classe. Donc ta string c'est une instance de classe. Alors que int, double, etc ... sont des types primitifs, qui n'obéissent pas aux mêmes règles.

    Donc quand tu fais a == b avec des String, ça ne peut que renvoyer faux puisque tu compares les adresses mémoire dans la JVM et pas les valeurs.

    Je sais pas si je suis clair.

    Évidemment pour comprendre il faut connaitre les règles de gestion des références en Java.
    Un problème avec Git ? Essayez la FAQ, sinon posez votre question sur le forum.



    "Toute personne croyant qu'une croissance exponentielle peut durer indéfiniment dans un monde fini est soit un fou, soit un économiste."
    Kenneth E. Boulding

    "Les richesses naturelles sont inépuisables, car, sans cela, nous ne les obtiendrions pas gratuitement. Ne pouvant être ni multipliées ni épuisées, elles ne sont pas l’objet des sciences économiques."
    Jean-Baptiste Say, Traité d'économie politique, 1803.

    "/home/earth is 102% full ... please delete anyone you can."
    Inconnu

  4. #4
    Membre confirmé Avatar de javaNavCha
    Homme Profil pro
    EKG Group
    Inscrit en
    Juillet 2009
    Messages
    311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Tunisie

    Informations professionnelles :
    Activité : EKG Group
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2009
    Messages : 311
    Points : 631
    Points
    631
    Par défaut
    Tu pourras utiliser
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (a.compareTo(b)==0) {
    ....
    }
    On essaie
    et ça marchera

    Mon site
    Ma page

  5. #5
    Membre averti
    Avatar de Chatanga
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 211
    Points : 346
    Points
    346
    Par défaut
    Pour être précis :

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    import static java.lang.System.out;
     
    public class Machin
    {
        public static void main(String[] arguments) {
     
            int int1 = 0;
            int int2 = 0;
            out.println(int1 == int2); // true
     
            Integer integer1 = new Integer(0);
            Integer integer2 = integer1;
            out.println(integer1 == integer2); // true
     
            integer2 = new Integer(0);
            out.println(integer1 == integer2); // false
     
            // Unboxing automatique.
            int1 = integer1;
            int2 = integer2;
            out.println(int1 == int2); // true
     
            // Certains types wrappers font de l'optimisation.
            integer1 = Integer.valueOf(0);
            integer2 = Integer.valueOf(0);
            out.println(integer1 == integer2); // true
     
            // Jusqu'à un certain point...
            integer1 = Integer.valueOf(128);
            integer2 = Integer.valueOf(128);
            out.println(integer1 == integer2); // false
     
            // Le boxing automatique n'est que du sucre syntaxique pour faire la même chose.
            integer1 = 0;
            integer2 = 0;
            out.println(integer1 == integer2); // true
     
            // Idem.
            integer1 = 128;
            integer2 = 128;
            out.println(integer1 == integer2); // false
     
            String string1 = new String("toto");
            String string2 = new String("toto");
            out.println(string1 == string2); // false
     
            string1 = new String("toto");
            string2 = string1;
            out.println(string1 == string2); // true
     
            // Sorte de boxing qui existait avant Java 1.5 pour les valeurs littérales.
            string1 = "toto";
            string2 = "toto";
            out.println(string1 == string2); // true
        }
    }
    La seule règle pertinente reste cependant de savoir ce qu'on veut comparer. Avec les types primitifs, seule leur valeur est comparable. Avec tous les autres, c'est à dire les références d'objets, on peut comparer leur identité (opérateur ==) ou bien leur contenu (méthode equals). Typiquement, lorsqu'on clone un objet, on obtient un nouvel objet identique (identité différente), mais de même contenu. Le C++ est peut-être plus explicite à ce sujet puisqu'on voit bien la différence entre un et un "string *", un "string &" et un "string" (ce dernier n'existant pas en Java où seuls les types primitifs sont accessibles par valeur).

  6. #6
    Membre confirmé Avatar de javaNavCha
    Homme Profil pro
    EKG Group
    Inscrit en
    Juillet 2009
    Messages
    311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Tunisie

    Informations professionnelles :
    Activité : EKG Group
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2009
    Messages : 311
    Points : 631
    Points
    631
    Par défaut
    Citation Envoyé par Chatanga Voir le message
    Pour être précis :

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    import static java.lang.System.out;
     
    public class Machin
    {
        public static void main(String[] arguments) {
     
            int int1 = 0;
            int int2 = 0;
            out.println(int1 == int2); // true
     
            Integer integer1 = new Integer(0);
            Integer integer2 = integer1;
            out.println(integer1 == integer2); // true
     
            integer2 = new Integer(0);
            out.println(integer1 == integer2); // false
     
            // Unboxing automatique.
            int1 = integer1;
            int2 = integer2;
            out.println(int1 == int2); // true
     
            // Certains types wrappers font de l'optimisation.
            integer1 = Integer.valueOf(0);
            integer2 = Integer.valueOf(0);
            out.println(integer1 == integer2); // true
     
            // Jusqu'à un certain point...
            integer1 = Integer.valueOf(128);
            integer2 = Integer.valueOf(128);
            out.println(integer1 == integer2); // false
     
            // Le boxing automatique n'est que du sucre syntaxique pour faire la même chose.
            integer1 = 0;
            integer2 = 0;
            out.println(integer1 == integer2); // true
     
            // Idem.
            integer1 = 128;
            integer2 = 128;
            out.println(integer1 == integer2); // false
     
            String string1 = new String("toto");
            String string2 = new String("toto");
            out.println(string1 == string2); // false
     
            string1 = new String("toto");
            string2 = string1;
            out.println(string1 == string2); // true
     
            // Sorte de boxing qui existait avant Java 1.5 pour les valeurs littérales.
            string1 = "toto";
            string2 = "toto";
            out.println(string1 == string2); // true
        }
    }
    La seule règle pertinente reste cependant de savoir ce qu'on veut comparer. Avec les types primitifs, seule leur valeur est comparable. Avec tous les autres, c'est à dire les références d'objets, on peut comparer leur identité (opérateur ==) ou bien leur contenu (méthode equals). Typiquement, lorsqu'on clone un objet, on obtient un nouvel objet identique (identité différente), mais de même contenu. Le C++ est peut-être plus explicite à ce sujet puisqu'on voit bien la différence entre un et un "string *", un "string &" et un "string" (ce dernier n'existant pas en Java où seuls les types primitifs sont accessibles par valeur).
    Bonjour...
    Alors, pour être plus clair
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    String string1 = new String("toto");
            String string2 = new String("toto");
            out.println(string1.compareTo(string2)==0); // false
    en String, dire S1==S2 c'est a dire avoir la même adresse, et bien sûr tu auras un false comme résultat
    On essaie
    et ça marchera

    Mon site
    Ma page

  7. #7
    Membre confirmé Avatar de javaNavCha
    Homme Profil pro
    EKG Group
    Inscrit en
    Juillet 2009
    Messages
    311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Tunisie

    Informations professionnelles :
    Activité : EKG Group
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2009
    Messages : 311
    Points : 631
    Points
    631
    On essaie
    et ça marchera

    Mon site
    Ma page

Discussions similaires

  1. Diff IE7 et Firefox que je comprends pas
    Par syl2042 dans le forum Mise en page CSS
    Réponses: 15
    Dernier message: 20/09/2007, 10h35
  2. [FTP] Pb sur foreach que je comprend pas
    Par Shandler dans le forum Langage
    Réponses: 3
    Dernier message: 28/12/2006, 18h31
  3. Erreur que je comprends pas
    Par makohsarah dans le forum Langage
    Réponses: 1
    Dernier message: 30/08/2006, 18h14
  4. Petit truc tout simple que je comprend pas
    Par Olaf MENJI dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 29/11/2005, 16h56
  5. Réponses: 13
    Dernier message: 27/06/2005, 14h36

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