Partage
  • Partager sur Facebook
  • Partager sur Twitter

Différence entre String chaine ="" et = new String()

    13 mai 2009 à 12:09:08

    bonjour,

    je me demandais qu'elle était la différence entre:

    String chaine = "";
    


    et

    String chaine = new String();
    


    perso j'utilise toujours la 1ere solution, mais dans un programme de quelqu'un d'autre que j'ai du reprende, il utile la 2eme et apres un temps assez long j'ai le message d'erreur:

    java.lang.NullPointerException: 0
    java.lang.String.<init>(), bci=4

    et je me demandais si ça ne pouvait pas venir de là.

    edit: appremment ça ne vient pas de la façon de déclarer, mais le bug viens de la...

    c'est un bete string pourtant :'(
    • Partager sur Facebook
    • Partager sur Twitter
      13 mai 2009 à 12:31:53

      Je crois que dans le premier cas java regarde si la string que tu lui assignes n'est pas déjà présente dans un pool. Ca permet d'économiser un petit peu de la mémoire.
      Mais je ne suis pas sûr à 100%...
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        13 mai 2009 à 13:19:41

        C'est bien ça, et ça peut également se généraliser à tous les wrappers de primitif.

        Pour le type String il vérifie l'existence d'une chaine équivalente dans le pool, si il la trouve, il crée simplement une référence dessus, elles peuvent donc même être comparées avec '==' (c'est juste pour l'explication, en pratique, ne jamais le faire), si pas il alloue de la mémoire, crée l'objet puis le référence.
        • Partager sur Facebook
        • Partager sur Twitter
          13 mai 2009 à 14:06:50

          Citation

          C'est bien ça, et ça peut également se généraliser à tous les wrappers de primitif.


          Voilà pourquoi il peut être intéressant d'utiliser Integer.valueOf plutôt que new Integer. Je me demande d'ailleurs quelle variante choisit java lorsqu'il fait de l'autoboxing.
          • Partager sur Facebook
          • Partager sur Twitter
            13 mai 2009 à 14:18:11

            Un code simple pour te convaincre :
            String c1 = "toto";
            String c2 = "toto";
            if (c1 == c2) // A ne jamais faire dans un code
                System.out.println("Même objet");
            else if (c1.equals(c2))
                System.out.println("Objets équivalent (mais espaces mémoires différents");
            
            String c3 = new String("toto");
            String c4 = new String("toto");
            if (c1 == c2) // A ne jamais faire dans un code
                System.out.println("Même objet");
            else if (c1.equals(c2))
                System.out.println("Objets équivalent (mais espaces mémoires différents");
            
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              13 mai 2009 à 15:18:33

              Citation : Dalshim

              Un code simple pour te convaincre :

              String c1 = "toto";
              String c2 = "toto";
              if (c1 == c2) // A ne jamais faire dans un code
                  System.out.println("Même objet");
              else if (c1.equals(c2))
                  System.out.println("Objets équivalent (mais espaces mémoires différents");
              
              String c3 = new String("toto");
              String c4 = new String("toto");
              if (c1 == c2) // A ne jamais faire dans un code
                  System.out.println("Même objet");
              else if (c1.equals(c2))
                  System.out.println("Objets équivalent (mais espaces mémoires différents");
              


              il y a juste une petite erreur :
              else if (c1.equals(c2))
              System.out.println("Objets équivalent (mais espaces mémoires différents");

              equals ne veut pas forcement dire espace mémoire différent, il se base juste sur son implémentation.

              avec
              String c1 = "toto";
              String c2 = "toto";

              if (c1.equals(c2)) renverra aussi true vu que l'implémtantation d'equals dans String commence par
              public boolean equals(Object anObject) {
              if (this == anObject) {
              return true;
              }
              et on sait que dans ce cas c1 == c2.

              et même si ce n'était pas le cas, le test sur le tableau de char renverrai true de toute façon.
              • Partager sur Facebook
              • Partager sur Twitter
                13 mai 2009 à 16:17:05

                Ce que tu dis est vrai, mais j'ai mis le code dans un else if, signifiant donc que j'ai vérifié au préalable si les deux variables ne référençaient pas le même objet.
                Ce que j'ai écrit reste donc vrai (même si je te l'accorde, ça peut paraitre ambigüe) :D .
                • Partager sur Facebook
                • Partager sur Twitter

                Différence entre String chaine ="" et = new 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