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

avec Java Discussion :

2 façons d'instancier des objets de type String


Sujet :

avec Java

  1. #1
    Membre averti Avatar de fantomas261
    Inscrit en
    Avril 2007
    Messages
    486
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 486
    Points : 331
    Points
    331
    Par défaut 2 façons d'instancier des objets de type String
    Bonjour
    1er cas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    String s1 = "message" ; 
    String s2 = "message"
    2e cas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    String s3 = new String("message") ; 
    String s4 = new String("message")
    dans le 1er cas je crée un seul object.
    je voudrais savoir si dans le 2eme cas je crée 1 ou 2 objets ?

    il existe aussi 2 façon d'instancier un tableau.
    Il doit y avoir des raisons pour que ces 2 écritures existes ?
    Est ce qu'il y a un moyen de connaitre l'adresse d'un objet ?

    merci

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    premier cas: s1 et s2 pointent vers une même instance, la chaine statique "message". Donc une seule String (si on n'est pas trop regardant aux détails du classloading)

    deuxième cas: trois String: la chaine statique, s3 et s4.

    Il est rare d'avoir besoin de faire appel explicitement au constructeur String(String). En général les String sont soit statiques (ton premier cas), soit obtenues à partir de Stringbuilder / StringBuffer ou des méthodes dans la classe String (replaceAll, subString, etc), soit encore créées à partir des constructeurs type String(char[]), String(byte[]), ...

  3. #3
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Points : 15 059
    Points
    15 059
    Par défaut
    Avec un petit test aussi, tu aurais pu tirer de conclusion
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    String s1 = "message" ; 
    String s2 = "message";
    String s3 = new String("message") ; 
    String s4 = new String("message");
    System.out.println (s1==s2);
    System.out.println (s1==s3);
    System.out.println (s3==s4);
    A+.

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par fantomas261 Voir le message
    il existe aussi 2 façon d'instancier un tableau.
    Plus que cela. Je suppose que tu parles de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    String[] tab1 = new String[3];
    // ou
    String[] tab2 = {"element1", "element2", "element3"};
    Citation Envoyé par fantomas261 Voir le message
    Il doit y avoir des raisons pour que ces 2 écritures existes ?
    Ben, oui, elles ne font pas la même chose. La première crée le tableau mais initialise toutes ses cases à la valeur par défaut.
    La seconde crée le tableau et initialise toutes les cases aux valeurs voulues.

    C'est juste pas pareil, on utilise à chaque fois celle dont on a besoin.

    Citation Envoyé par fantomas261 Voir le message
    Est ce qu'il y a un moyen de connaitre l'adresse d'un objet ?
    Il y a moyen de connaître son identifiant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int idObjet = System.identityHashCode(monObjet);
    C'est ce qu'il y a de plus proche d'une adresse d'objet en Java.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre averti Avatar de fantomas261
    Inscrit en
    Avril 2007
    Messages
    486
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 486
    Points : 331
    Points
    331
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    String s1 = new String("message");
    String s2 = new String("message");
    System.out.println(s1==s2); //false
     
    String s3 = "message";
    String s4 = "message";
    System.out.println(s3==s4); //true
    je pensais à ces deux types d'instanciation de tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int[] tab1 = new int[]{1,2};
    int[] tab2 = new int[]{1,2};
    System.out.println(tab1==tab2); //false
     
    int[] tab3 = {1,2};
    int[] tab4 = {1,2};
    System.out.println(tab3==tab4); /* false, mais en regardant la 2eme façon d'instancier un objet de type String, j'aurais pensé obtenir true ... */

  6. #6
    Membre averti Avatar de fantomas261
    Inscrit en
    Avril 2007
    Messages
    486
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 486
    Points : 331
    Points
    331
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    deuxième cas: trois String: la chaine statique, s3 et s4.
    2 String ?

  7. #7
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Points : 15 059
    Points
    15 059
    Par défaut
    Citation Envoyé par fantomas261 Voir le message
    je pensais à ces deux types d'instanciation de tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int[] tab1 = new int[]{1,2};
    int[] tab2 = new int[]{1,2};
    System.out.println(tab1==tab2); //false
     
    int[] tab3 = {1,2};
    int[] tab4 = {1,2};
    System.out.println(tab3==tab4); /* false, mais en regardant la 2eme façon d'instancier un objet de type String, j'aurais pensé obtenir true ... */
    C'est différent, l'opérateur "==" ne fonctionne que sur les types primitifs (int, float, ...) et les objets immuables (String, Integer) déclarés statiquement (mais pas par le constructeur new). Dans ton exemple, tu as un tableau (Arrays) donc tab3 et tab4 se pointent sur différents objets bien qu'ils ont les mêmes valeurs.

    A+.

  8. #8
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Points : 15 059
    Points
    15 059
    Par défaut
    Citation Envoyé par fantomas261 Voir le message
    2 String ?
    3 la chaine statique(s1 et s2), s3 et s4.

  9. #9
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par fantomas261 Voir le message
    je pensais à ces deux types d'instanciation de tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int[] tab1 = new int[]{1,2};
    int[] tab2 = new int[]{1,2};
    System.out.println(tab1==tab2); //false
     
    int[] tab3 = {1,2};
    int[] tab4 = {1,2};
    System.out.println(tab3==tab4); /* false, mais en regardant la 2eme façon d'instancier un objet de type String, j'aurais pensé obtenir true ... */
    Tableaux et String n'ont rien à voir. Il ne faut pas essayer de faire des associations d'idées en pensant que la syntaxe se ressemble.
    C'est pas le cas. Ça fonctionne pas pareil.

    Dans le cas des tableaux, ces deux notations vont toujours créer des nouveaux tableaux.
    Les deux existent parce que la deuxième est plus courte, plus lisible, plus pratique. Mais elle est obligée de faire de l'inférence de type, puisqu'elle n'indique pas précisément le type du tableau à créer.
    Or l'inférence de type n'est pas toujours possible, et pas toujours correcte. D'où la nécessité d'existence de la première syntaxe.

    Citation Envoyé par fantomas261 Voir le message
    2 String ?
    Non, 3 :

    A, B et C. Ça fait trois trucs.
    La chaine statique, s3 et s4.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Points : 15 059
    Points
    15 059
    Par défaut
    Si tu veux comparer les deux tableaux, utilise la méthode equals de la classe Arrays.

    A+.

  11. #11
    Membre averti Avatar de fantomas261
    Inscrit en
    Avril 2007
    Messages
    486
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 486
    Points : 331
    Points
    331
    Par défaut
    Citation Envoyé par andry.aime Voir le message
    les objets immuables (String, Integer) déclarés statiquement (mais pas par le constructeur new).
    peux tu me donner un objet de type Integer déclaré statiquement.
    merci

  12. #12
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Points : 15 059
    Points
    15 059
    Par défaut
    Toujours un chti test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Integer a = 9; // ce que tu cherches
    Integer b = 9;
    Integer c = new Integer(9);
    Integer d = new Integer(9);
    System.out.println(a==b);
    System.out.println(a==c);
    System.out.println(c==d);
    Essaie aussi avec un type Double et/ou Float et tu verras bien la différence.

    A+.

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par andry.aime Voir le message
    et les objets immuables (String, Integer) déclarés statiquement (mais pas par le constructeur new).
    Moui, c'est quand même un sacré raccourcis (même si il est suffisant pour les débutants).
    Integer -> On peux comparer entre eux avec == tous les integer issus d'un autoboxing dans le range -128 +127 (ou l'inverse, je sais plus) ou d'un appel à Integer.valueOf(int) dans le même range
    Byte, Boolean -> Tout ce qui est issu d'un autoboxing ou d'un appel à Byte.valueOf(byte), Boolean.valueOf(boolean) supporte le ==
    String -> Tout ce qui est issue de la méthode String.intern() support le == (c'est son but )

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

Discussions similaires

  1. itération sur des objets de types différents ?
    Par jc63 dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 07/09/2007, 08h19
  2. Instancier des objets d'une FormView
    Par Paulo2901 dans le forum ASP.NET
    Réponses: 16
    Dernier message: 22/08/2007, 17h10
  3. Réponses: 1
    Dernier message: 05/06/2007, 17h14
  4. Réponses: 3
    Dernier message: 16/10/2006, 11h06
  5. [Debutant][Conception] visibilité des objets de type conteneur
    Par thebloodyman dans le forum Général Java
    Réponses: 10
    Dernier message: 04/01/2006, 12h44

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