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 :

[Examen OCA] égalité des String


Sujet :

Langage Java

  1. #1
    Membre confirmé
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2009
    Messages : 74
    Par défaut [Examen OCA] égalité des String
    Bonjour,
    j'ai ce petite comparaison
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    String x="Hello World";
    String z=" Hello World".trim();
    System.out.println(x==z);//false
    je ne viens pas de comprendre pourquoi false car normallement après que j'applique la fonction trim() l'espace va etre supprimé et par conséquent les deux chaines vont pointer sur le meme référence
    et c'est l'explication qu'ils ont mentionné au niveau de livre "In this example,we don't have two of the same String literal.Although x and z happen to evaluate to the same string,one is computed at runtime.Since it isn't the same at compile-time, a new String object is created."

  2. #2
    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
    https://docs.oracle.com/javase/8/doc...ng.html#trim--

    Trim supprime les espaces au début et à la fin d'une chaine, contrairement à ce que tu penses.

    Sans le Trim, tu aurais eu égalité. Une seule chaine serait créée dans le pool.

  3. #3
    Membre confirmé
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2009
    Messages : 74
    Par défaut
    ce que je ne viens pas a comprendre c'est est ce que la variable z va être initialisé par " Hello World" ou applique la fonction trim() ensuite affecte le résultat au variable z?!!

  4. #4
    Membre Expert Avatar de yildiz-online
    Homme Profil pro
    Architecte de domaine
    Inscrit en
    Octobre 2011
    Messages
    1 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte de domaine

    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 447
    Par défaut
    Citation Envoyé par emna1987 Voir le message
    Bonjour,
    j'ai ce petite comparaison
    String x="Hello World";
    String z=" Hello World".trim();
    System.out.println(x==z);//false
    je ne viens pas de comprendre pourquoi false car normallement après que j'applique la fonction trim() l'espace va etre supprimé
    C'est exact.

    Citation Envoyé par emna1987 Voir le message
    et par conséquent les deux chaines vont pointer sur le meme référence
    Non, la fonction trim doit effectuer une transformation, et vu que String est une classe immuable, elle doit alors créer et retourner une nouvelle instance, donc avec une référence différente.
    Les 2 String vont effectivement avoir le même contenu (equals retournera true), mais elles seront 2 objets distincts en mémoire.

    Pour que les 2 variables partagent la même référence mémoire au sein du pool, il est nécessaire d'appeler la méthode intern, qui fournira la référence de l'instance contenue dans le pool et donc de l'assigner à la variable.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String z=" Hello World".trim().intern();

  5. #5
    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
    Je n'ai pas vu l'espace de début de deuxième chaine, désolé pour mon message.

  6. #6
    Membre confirmé
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2009
    Messages : 74
    Par défaut
    oui je sais que String est immutable mais ce que me gène est ce que String z=" Hello World".trim(); c'est est ce que " Hello World".trim() va être exécuté et l'espace est supprimé et ensuite va etre affecté a la variable z ou " Hello World" est affecté et par la suite trim() est appliqué et comme ça un noveau objet va etre crée vue que string est immuable

  7. #7
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    ?????

    La variable z est affectée une valeur après que l'on ait fini de calculer cette valeur, pas avant.

    De plus, une fois qu'une variable s'est vue affecter un object avec z = quelquechose;, elle ne pointera jamais vers un autre objet que celui-là, sauf si on fait à nouveau z = autrechose; .
    Aucun appel de méthode sur cet objet ne peut y faire quoi que ce soit. En théorie, si l'objet est mutable, appeler une méthode dessus peut changer le contenu de l'objet. String étant immutable, cela ne peut pas arriver non plus.

    Bref, une fois qu'une variable pointe vers un objet String, elle ne pointera pas vers un autre, sauf si on lui affecte cet autre avec z = autre;
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Membre confirmé
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2009
    Messages : 74
    Par défaut
    autrement dit lorsque j'effectue System.out.println(z); z contient "Hello World" sans espace mais pourquoi la comparaison retourne false en tant que x et z en affichant leurs contenu contient la meme valeurs et les deux sont initialisées par literal avec les deux cote de string ""

  9. #9
    Membre Expert Avatar de yildiz-online
    Homme Profil pro
    Architecte de domaine
    Inscrit en
    Octobre 2011
    Messages
    1 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte de domaine

    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 447
    Par défaut
    Non les litterals sont différents, il y en a un avec un espace.

  10. #10
    Membre émérite Avatar de Cincinnatus
    Homme Profil pro
    Développeur d'applications métier
    Inscrit en
    Mars 2007
    Messages
    593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur d'applications métier
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2007
    Messages : 593
    Par défaut
    == n'est pas le même que equals sur des objets (dont String) :
    https://docs.oracle.com/javase/7/doc...a.lang.Object)

  11. #11
    Membre Expert Avatar de yildiz-online
    Homme Profil pro
    Architecte de domaine
    Inscrit en
    Octobre 2011
    Messages
    1 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte de domaine

    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 447
    Par défaut
    Citation Envoyé par Cincinnatus Voir le message
    == n'est pas le même que equals sur des objets (dont String) :
    https://docs.oracle.com/javase/7/doc...a.lang.Object)
    Ca dépend de l'implémentation d'equals, par défaut (en héritant d'Object sans redéfinir donc), c'est la même chose.

  12. #12
    Membre émérite Avatar de Cincinnatus
    Homme Profil pro
    Développeur d'applications métier
    Inscrit en
    Mars 2007
    Messages
    593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur d'applications métier
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2007
    Messages : 593
    Par défaut
    Citation Envoyé par yildiz-online Voir le message
    Ca dépend de l'implémentation d'equals, par défaut (en héritant d'Object sans redéfinir donc), c'est la même chose.
    Mais il est plus sûr, et une meilleure pratique, de comparer les objets par .equals() et seules les types primitifs (int, boolean) par ==.
    Pour le reste, @thelvin a donné les autres arguments (littéral vs résultat de traitement à l'exécution).

  13. #13
    Membre Expert Avatar de yildiz-online
    Homme Profil pro
    Architecte de domaine
    Inscrit en
    Octobre 2011
    Messages
    1 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte de domaine

    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 447
    Par défaut
    Non, la meilleure pratique est d’être conscient de l’implémentation de l’equals et de l’utiliser en connaissance de cause.

    Pour une question de lisibilité, il peut être mieux d’utiliser ==, par exemple pour des objets d’un pool(value objects) afin de bien marquer leur unicité.

  14. #14
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Drôle d'idée. En quoi cela est-il utile ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  15. #15
    Membre Expert Avatar de yildiz-online
    Homme Profil pro
    Architecte de domaine
    Inscrit en
    Octobre 2011
    Messages
    1 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte de domaine

    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 447
    Par défaut
    Sémantique, pour l'expression de value objects uniques comme des id, des états...

  16. #16
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Ok donc des enums ou des trucs qui jouent pareil sur l'unicité. Pas des String qui n'ont pas vocation à faire ça de manière généralement prédictible.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  17. #17
    Membre Expert Avatar de yildiz-online
    Homme Profil pro
    Architecte de domaine
    Inscrit en
    Octobre 2011
    Messages
    1 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte de domaine

    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 447
    Par défaut
    Dans un système ou une String aurait une sémantique d'identité uniquement, ce serait envisageable, mais je n'en connais pas où ce serait une bonne idée, et quand bien même, ça resterait très spécifique.

    Sinon oui, pour des objets valeur résidant dans un pool, ou des enums évidemment.

Discussions similaires

  1. livre OCA SQL EXPERT EXAM GUIDE 1Z0-047
    Par rvfranck dans le forum Livres
    Réponses: 14
    Dernier message: 21/12/2009, 14h41
  2. éliminer un caractere d'un string
    Par no-vice dans le forum Langage
    Réponses: 5
    Dernier message: 09/08/2002, 14h55
  3. URGENT: retour de string
    Par Pinggui dans le forum CORBA
    Réponses: 4
    Dernier message: 15/07/2002, 09h47
  4. Réponses: 2
    Dernier message: 05/06/2002, 12h29
  5. String Grid et choix d'une couleur pour une ligne
    Par Gigottine dans le forum C++Builder
    Réponses: 12
    Dernier message: 17/05/2002, 15h23

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