Partage
  • Partager sur Facebook
  • Partager sur Twitter

Comparaison de String

Sujet résolu
    5 septembre 2019 à 16:04:19

    Hello,

    Voici un bout de code tiré d'un exercice de QCM et je ne saisis pas la réponse :

     What is the result of the following code? (Choose all that apply)
    String a = ""; 
    a += 2;
    a += 'c';
    a += false; if ( a == "2cfalse") System.out.println("=="); if ( a.equals("2cfalse")) System.out.println("equals");




    Tout d'abord la comparaison avec le == est juste là pour compliquer l'exercice mais je sais qu'il s'agit d'une mauvaise pratique, car le == ne compare que les variables qui référencent l'objet.

    Bref, dans ce cas je pensais que le code, en partant du principe que a="2cfalse" (pas d'instance avec new et exprimé en littéral) aurait retourné "==" et "equal". Je me suis basé à tord sur l'exemple suivant :

    String s1 = "hello";
    System.out.println(s1 == "hello");
    

    Ici on retourne true car s1 est exprimé en littéral et est stocké dans le String pool.

    Du coup je déduis que : a ="2cfalse" de l'exercice n'est pas un littéral, mais bien une instance stockée dans le heap autre part que dans le pool. Est-ce valable ? Si oui, est-ce dû à la concaténation ?

    Merci d'avance

    -
    Edité par Olchiba 5 septembre 2019 à 16:06:10

    • Partager sur Facebook
    • Partager sur Twitter
      6 septembre 2019 à 8:51:39

      Hello, je ne saurais pas expliquer le pourquoi du comment sur cet exemple.

      Par contre, je sais que le "==" on ne l'utilise que sur des variables primitives.

      "equals()" plutôt sur des objets. Par contre, il faut faire attention. Par défaut "equals()" applique "==" si elle n'est pas redéfini.

      L'objet "String" redéfini cette méthode pour avoir une bonne comparaison =)

      • Partager sur Facebook
      • Partager sur Twitter
        9 septembre 2019 à 17:13:40

        le fait est que comme ton String est dynamiquement créé (en Java les String sont immuables, il en récréer un à chaque modifications), et les String dynamiquement créé ne sont pas ajouté dans le String pool automatiquement. Mais tu peux forcer l'ajout en appelant "tonString.intern()" et tu verras que "==" va fonctionner.

        String a = "";
        a += 2;
        a += 'c';
        a += false;
        a.intern();
        if ( a == "2cfalse") System.out.println("==");
        if ( a.equals("2cfalse")) System.out.println("equals");



        • Partager sur Facebook
        • Partager sur Twitter
          10 septembre 2019 à 9:25:06

          Merci pour ta réponse

          En fait au risque de dire une bétise, cela signifie que, à chaque conténation, il y a une construction d'un nouveau string avec un new (qui est implicite) ?

          • Partager sur Facebook
          • Partager sur Twitter
            10 septembre 2019 à 21:44:43

            Ce n'est pas une bêtise, c'est exactement ce qui se passe.

            C'est pour cela qu'il vaut mieux éviter les concaténations de chaines.

            Mieux vaut utiliser la classe StringBuilder qui permet de "concaténer" des chaines de façon plus efficace.

            • Partager sur Facebook
            • Partager sur Twitter
              11 septembre 2019 à 16:26:15

              Merci à toi d'avoir confirmé !
              • Partager sur Facebook
              • Partager sur Twitter

              Comparaison de String

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown