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 :

Trouble avec String Immutable


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2006
    Messages : 122
    Par défaut Trouble avec String Immutable
    Salut,

    J'ai ete a un entretien et l'une des questions ressemblait a ceci (je passe les tests du meme genre sur String avec equals et l'utilisation de new):

    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
    public class TestString {
       public static void main(String[] args) {
          String t1 = "France";
          String t2 = t1 + " Mexique";
          String t3 = t1 + " Mexique";    
     
          String t4 = "France" + " Mexique";
          String t5 = "France" + " Mexique";
     
          if(t2 == t3)
             System.out.println("Equals"); 
          else
             System.out.println("Not Equals"); //Resultat affiche
     
          if(t4 == t5)
             System.out.println("Equals"); //Resultat affiche
          else
             System.out.println("Not Equals");
       }
    }
    Je me dis sur le coup, vu qu'un String ne peut pas changer, t2 et t3 pointent forcement sur le meme objet, donc le 1er test afficherait "Equals". Ce n'est pourtant pas le cas, et j'ai un peu de mal à m'expliquer pourquoi, surtout quand on voit que le 2nd test renvoie "Equals" comme prevu. Pourquoi t2 et t3 pointent ils sur des objets differents ?

    Merci d'avance de votre aide.

    Nuriel

  2. #2
    Membre confirmé Avatar de r2d2abc
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 212
    Par défaut
    Salut, Immutable signifie not mutable (!mutable (String,Integer,, type primitifs)) c'est à dire que l'attribut devient une constante une fois initialisée et ne peut donc être modifiée (eq final devant une déclaration). Ajouter des constantes entre elles et les assigner à deux variables donne une constante donc une réference unique, donc les 2 variables pointent sur la même valeur, donc égalité vraie, tout autre cas multiplie les instances donc des tests d'équivalence faussés.
    http://gfx.developpez.com/tutoriel/java/strings/
    hth...

  3. #3
    Invité
    Invité(e)
    Par défaut
    Salut,

    Ici ce comportement est explicable comme suit: Pour les chaines un pool est utilisé pour ne pas réinstantier une chaine si le compilateur peut déterminer statiquement que le résultat est le même. Dans le cas où tu concatènes deux litéraux chaines "France" + "Mexique", le compilateur est sûr que le résultat est le même dans les deux cas, donc la même instance sera référencée.
    L'analyse statique exécutée par le compilo Java est plutôt sommaire étant donné que la VM s'occupe de vraiment optimiser, donc dans l'autre cas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     String t1 = "France";
     String t2 = t1 + " Mexique";
     String t3 = t1 + " Mexique";
    L'utilisation de t1 fait que le compilo n'est plus capable de déterminer que t1 n'a pas été changé entre les deux utilisations. Une analyse statique plus poussée (dans ce cas une analyse du flux de contrôle montrerait tout de suite que t1 n'est pas modifié et on pourrait même inliner, mais ça changerait beaucoup le comportement habituel du compilo et pourrait conduire à des résultats inattendus) pourrait permettre de le déterminer, mais le compilo ne fait pas la différence entre ce cas et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     String t1 = "France";
     String t2 = t1 + " Mexique";
     t1 = "Allemagne";
     String t3 = t1 + " Mexique";
    Et donc deux instances différentes sont utilisées pour t2 et t3.
    J'espère avoir été clair

    A plus

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    je rajoute que poser cette question à un entretiens, à moins qu'on demande un programmeur java avec 5 ans d'expérience effective, c'est du chipo n'importe nawak C'est vraiment pour dire de ne finir avec aucun candidat si toutes les questions étaient dans le même accabi D'ailleurs un "bon" candidat répondrait que, de toutes façons, on ne compare pas des String avec == sauf si on veux risquer de foutre en l'air le code au moindre changement


    Je rajouterais que le comportement d'égalité dans le cas où les string ont statiquement pu être analysée commé étant égales, n'est pas nécessairement le même d'un compilateur à l'autre. Certe le compilo de oracle le fait, mais d'autre compilateurs pourraient ne pas le faire, ou, à l'inverse, pourraient aussi le faire dans l'autre cas.

  5. #5
    Membre Expert
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Par défaut
    Perso, j'aurais répondu que ca depend de la gestion de la memoire par la VM (faut pas oublier que l'un des plus gros interet de java est l'aspect multi-plateforme donc il vaut mieux eviter le code spécifique qui marchera sur tel version sur tel OS et pas sur tel autre) et que si on veut tester si 2 chaines sont identiques, il faut utiliser Object.equals...

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    rien à voir avec la gestion de la mémoire par la jvm, les règle de la jvm sont les même pour tout le monde ^^. Quand tu fais un new t'as un nouvel objet et donc == dira false. C'est le compilateur qui, pour le code monté plus haut, choisi où et comment il place ses new

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. strlen et strcpy non reconnu avec string.h
    Par wolflinger dans le forum C++
    Réponses: 17
    Dernier message: 21/02/2006, 13h44
  2. [RegEx]Probleme avec String.split
    Par sebastieng dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 09/02/2006, 21h24
  3. Trouble avec Excel avec un programme qui utilise un Hook.
    Par hot_metal dans le forum Windows
    Réponses: 5
    Dernier message: 14/01/2006, 13h40
  4. Erreur compilation avec <string>
    Par seal3 dans le forum SL & STL
    Réponses: 9
    Dernier message: 25/08/2005, 20h41
  5. [Struts][logic:iterate] Probleme avec String
    Par julienOriano dans le forum Struts 1
    Réponses: 7
    Dernier message: 15/06/2004, 09h39

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