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 :

Réponse certif SCJP5 déroutante


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 53
    Par défaut Réponse certif SCJP5 déroutante
    Bonjour,

    sur un site sérieux posant la question de certif' scjp5 suivante
    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
     
    Given:
    11. public String makinStrings() {
    12. String s = “Fred”;
    13. s = s + “47”;
    14. s = s.substring(2, 5);
    15. s = s.toUpperCase();
    16. return s.toString();
    17. }
     
    How many String objects will be created when this method is invoked?
    	A. 1
    	B. 2
    	C. 3
    	D. 4
    	E. 5
    	F. 6
    la réponse était: C.

    Pour ma part, j'aurais répondu E pour la raison suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    11. public String makinStrings() {
    12. String s = “Fred”;//1 objet créé
    13. s = s + “47”; //2 objets créés
    14. s = s.substring(2, 5);//1 objet créé
    15. s = s.toUpperCase();//1 objet créé
    16. return s.toString();
    17. }
    Quelqu'un pourrait-il m'expliquer le résultat C ?

    Merci

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Je pense que cela vient du fait que les constantes des chaines de caractères sont réutilisées (elles sont "internées" par le compilateur) et ne correspondent pas à la création d'un objet, ainsi dans le code suivant :
    Cela correspond simplement à l'affectation d'un objet constant dans une référence : il n'y a pas vraiment de création d'objet.

    Plus d'info : String Literals


    Ainsi cela ferait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    11. public String makinStrings() {
    12. String s = “Fred”; // "Fred" et "47" existe déjà
    13. s = s + “47”; //1 String créé : "Fred47"
    14. s = s.substring(2, 5); //1 String créé : "ed4"
    15. s = s.toUpperCase(); //1 String créé : "ED4"
    16. return s.toString();
    17. }
    a++

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    Par défaut
    "Fred" et "47" existe déjà
    Tu voudrais dire que les 2 chaines ont été déjà déclarées auparavant ?

    Pour la certification, on ne doit se baser que sur les données de l'exercice, donc, ça me semble peu probable.
    (ou alors j'ai pas compris ce que tu voulais dire)

    J'aurais pensé comme 1tox. C'est ce qu'il me restait de la certif que j'ai préparée l'an dernier, mais peut-être que ma mémoire me fait défaut.

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    365
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Janvier 2006
    Messages : 365
    Par défaut
    Je suis assez d'accord avec fr1man. Les "string literals" sont stockés dans un pool et réutilisés au besoin, mais encore faut-il qu'ils existent déjà. Or, d'après les données dont on dispose pour cette question, ces literals n'ont été créés nulle part avant. Je pense aussi qu'il y a plus de trois objets String créés.

  5. #5
    Membre expérimenté
    Inscrit en
    Juin 2003
    Messages
    292
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 292
    Par défaut
    String API les gars!!

    The Java language provides special support for the string concatenation operator ( + ), and for conversion of other objects to strings. String concatenation is implemented through the StringBuilder(or StringBuffer) class and its append method.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 53
    Par défaut
    Effectivement, c'est la seule hypothèse plausible à mon avis aussi. En principe, à l'examen, les chaines constantes réutilisées sont indiquées clairement. On dira que dans notre cas, la question n'est pas suffisamment explicite . Peux-tu confirmer que la réponse E est correcte dans le cas d'une première utilisation des chaines "Fred" et "47"?

  7. #7
    Membre expérimenté
    Inscrit en
    Juin 2003
    Messages
    292
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 292
    Par défaut
    comment ca Fred et 47 existe deja?
    oui pour la re-utilisation des String ca c est vrai mais pas dans ce cas.
    Je suis certain de mon expliquation donc: le fait de faire s = s + "47" ca cree un StringBuilder or StringBuffer et pas un nouveau String.

    E est la reponse correcte!!!

  8. #8
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par jhaythem Voir le message
    Je suis certain de mon expliquation donc: le fait de faire s = s + "47" ca cree un StringBuilder or StringBuffer et pas un nouveau String.
    En effet la concaténation au runtime avec + utilise un StringBuilder (ou StringBuffer pour les version < Java 5.0), mais génère une nouvelle String à la fin, ainsi :
    Est strictement équivalent à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    s = new StringBuilder().append(s).append("47").toString();
    Et la méthode toString() de StringBuilder/StringBuffer crée bien une nouvelle String...

    Citation Envoyé par jhaythem Voir le message
    comment ca Fred et 47 existe deja?
    Il faudrait que je recherche une source sûr mais il me semble bien que toutes les expressions constantes représentant des String sont créées et chargé en mémoire lors du chargement de la classe... donc elles existent déjà lorsque la méthode est appelée...

    a++

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 53
    Par défaut
    En consultant ton lien Adiguba, j'ai vu effectivement que les constantes chaines étaient créées et mises dans le pool durant la phase de compilation et non à l'exécution.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    How many String objects will be created when this method is invoked
    L'astuce est peut-être là...

  10. #10
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    Par défaut
    De mémoire de ce que j'ai lu d'un bouquin de préparation à la certification, cette expression entraine la création de deux string.
    - une pour "47" qui est placé dans un pool de "constantes" chaines comme l'a dit manblaizo
    - une pour s qui reçoit la concatenation

    Encore une fois, je peux me tromper, mais il me semblait que c'était ça.

  11. #11
    Membre expérimenté
    Inscrit en
    Juin 2003
    Messages
    292
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 292
    Par défaut
    Salut je soupsonne cette partie qui t induit en erreur:
    s = s + "47";
    selon l API de la class String
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    The Java language provides special support for the string concatenation operator ( + ), and for conversion of other objects to strings. String concatenation is implemented through the StringBuilder(or StringBuffer) class and its append method. String conversions are implemented through the method toString, defined by Object and inherited by all classes in Java. For additional information on string concatenation and conversion, see Gosling, Joy, and Steele, The Java Language Specification.
    ce qui veut dire l operateur + va creer un Object StringBuilder or a StringBuffer pas un String.
    et la question te demande le nombre d objets String cree pas le nombre d objet.

    J espere que ceci repond a ta question.

    Cheers,

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

Discussions similaires

  1. Comment recevoir rapidement une réponse à votre question ?
    Par Community Management dans le forum Windows
    Réponses: 3
    Dernier message: 17/08/2014, 02h28
  2. Temps de réponse : objet TTable (BDE)
    Par lirva dans le forum Bases de données
    Réponses: 5
    Dernier message: 12/12/2003, 00h50
  3. Certification 70-228 sql server 2000
    Par Cotentin dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 20/11/2003, 09h01
  4. Temps de réponse entre deux sites
    Par coup dur dans le forum Décisions SGBD
    Réponses: 6
    Dernier message: 16/10/2003, 15h26
  5. réponse ds la meme page
    Par autumn319 dans le forum ASP
    Réponses: 13
    Dernier message: 03/09/2003, 18h02

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