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 :

Pourquoi instancier une classe String ?


Sujet :

avec Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2009
    Messages : 18
    Points : 14
    Points
    14
    Par défaut Pourquoi instancier une classe String ?
    Bonjour,

    Quelle différence entre déclarer une "variable" de type String de cette façon :

    String maVariable = "niania";

    Et l'instancier (sinon pour bénéficier des méthodes non static) ?

    String maVariable = new String("nianiania");

    Merci pour votre réponse !

  2. #2
    Membre extrêmement actif Avatar de jojodu31
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    875
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2008
    Messages : 875
    Points : 814
    Points
    814
    Par défaut
    Bonjour,
    je t'invite à lire cet article (encore une fois) très intéressant tu y trouveras tes réponses

    jojodu31

  3. #3
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 565
    Points : 21 631
    Points
    21 631
    Par défaut
    Citation Envoyé par Thoustra Voir le message
    (sinon pour bénéficier des méthodes non static) ?
    "nianiania" a parfaitement accès aux méthodes d'instance de String. Inutile de faire new String() pour ça.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2009
    Messages : 18
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par thelvin Voir le message
    "nianiania" a parfaitement accès aux méthodes d'instance de String. Inutile de faire new String() pour ça.

    Je pose la question parce que je ne comprends pas un truc simple

    Voyez :

    Je récupère une donnée de 11 cars dans refFlux

    elle s'affiche correctement, mais dès que je lui applique la méthode substring

    elle n'affiche plus rien.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    String refFlux = liste.getReferenceFlux();
    			  			System.out.println("refflux :" + refFlux); 			
    			  			String val = (refFlux.substring(3, 3));
     
    			  			System.out.println("VAL : " + val);
    résultat :

    refflux :RDEIDEMWT21
    VAL :

  5. #5
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 565
    Points : 21 631
    Points
    21 631
    Par défaut
    Devinette : qu'est-ce que le deuxième paramètre de substring() ?
    C'est l'index du caractère où la substring doit s'arrêter, exclusivement.

    donc, refFlux.substring(3, 3) => prendre la sous-string qui commence à l'index 3 et s'arrête avant l'index 3.
    On appelle ça la chaîne vide, on peut la noter directement ""

    Penser à lire la JavaDoc des méthodes qu'on utilise, avant de les utiliser.

    Je suppose que tu voulais faire ça : refFlux.substring(3, 6)

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2009
    Messages : 18
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Devinette : qu'est-ce que le deuxième paramètre de substring() ?
    C'est l'index du caractère où la substring doit s'arrêter, exclusivement.

    donc, refFlux.substring(3, 3) => prendre la sous-string qui commence à l'index 3 et s'arrête avant l'index 3.
    On appelle ça la chaîne vide, on peut la noter directement ""

    Penser à lire la JavaDoc des méthodes qu'on utilise, avant de les utiliser.

    Je suppose que tu voulais faire ça : refFlux.substring(3, 6)
    Désolé...

    pour d'autres langages le second paramètre signifie la longueur du substring, j'aurai dû effectivement lire plus attentivement (car lue !) la java doc.

    Dire que j'ai plongé dans des explications plus complexe (constructeurs de la classe String etc).

  7. #7
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 565
    Points : 21 631
    Points
    21 631
    Par défaut
    Note au passage que je préfère la convention des autres langages, qui me semble plus répandue... Mais la JavaDoc est tellement bien faite, quand on se pose une question c'est le premier endroit à consulter.

  8. #8
    Membre éclairé
    Homme Profil pro
    Développeur
    Inscrit en
    Juin 2006
    Messages
    645
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Juin 2006
    Messages : 645
    Points : 709
    Points
    709
    Par défaut
    Citation Envoyé par Thoustra Voir le message
    pour d'autres langages le second paramètre signifie la longueur du substring, j'aurai dû effectivement lire plus attentivement (car lue !) la java doc.
    C'est le piège amusant pour les gens qui ont fait du .Net

  9. #9
    Membre éclairé
    Homme Profil pro
    Développeur
    Inscrit en
    Juin 2006
    Messages
    645
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Juin 2006
    Messages : 645
    Points : 709
    Points
    709
    Par défaut
    Puisqu'on en parle, je me demandais.
    Quel est le comportement de ceci ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String a = b.substring(0, 1) + c.substring(0, 1);
    Y a-t-il création implicite d'un nouvel objet ?

  10. #10
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    En fait il y a une création de 4 objets !

    Chaque appel à substring() génère un nouvel objet String.
    Toutefois ce dernier partage le même buffer que le String original : seul ses index changent...

    Donc tes deux substring() génère chacun un nouvel objet.


    Les deux objets supplémentaires sont généré par l'opérateur +.
    Comme les String sont immuables, la concaténation de chaine via cet opérateur passe en fait via la classe StringBuilder, et le code a + b est en fait convertie en new StringBuilder().append(a).append(b).toString(), ce qui donne dans ton cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    String a = new StringBuilder() // Création d'un objet StringBuilder
        .append(b.substring(0, 1)) // Création d'un objet String
        .append(c.substring(0, 1)) // Création d'un objet String
        .toString(); // Création d'un objet String à partir du StringBuilder
    a++

    PS : Avant Java 5.0, les concaténations utilisaient la classe StringBuffer (même chose mais synchronisé).

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    765
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 765
    Points : 1 037
    Points
    1 037
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    PS : Avant Java 5.0, les concaténations utilisaient la classe StringBuffer (même chose mais synchronisé).
    Il faut même encore utiliser StringBuffer en multithreading, StringBuilder est plus rapide mais uniquement pour du simple thread.

  12. #12
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 565
    Points : 21 631
    Points
    21 631
    Par défaut
    Citation Envoyé par Jimmy_ Voir le message
    Il faut même encore utiliser StringBuffer en multithreading, StringBuilder est plus rapide mais uniquement pour du simple thread.
    En même temps je sais pas si tu concatènes souvent dans un même buffer avec des threads différents, mais moi j'en ai pas souvent l'usage.

    Mais dans l'absolu c'est vrai, oui.

  13. #13
    Expert éminent sénior
    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 : 45
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    sans compter que les objets temporaires créés par l'opérateur de concaténation ne pourront de toutes façons, pour des raison évidentes jamais être partagés entre plusieurs thread => la création par java de stringbuilder depuis java 5 puisqu'il n'y a aucun besoin de protéger par des synchronized ;-)

    Et oui, en 5 ans de carrière java, JAMAIS, je n'ai eu besoin de faire une concaténation sur plusieurs threads en //

  14. #14
    Membre éclairé
    Homme Profil pro
    Développeur
    Inscrit en
    Juin 2006
    Messages
    645
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Juin 2006
    Messages : 645
    Points : 709
    Points
    709
    Par défaut
    Voilà plus de détails que je n'en attendais, merci !

  15. #15
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    765
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 765
    Points : 1 037
    Points
    1 037
    Par défaut
    Oui c'est particulier, mais je suis sur un projet multithread qui justement a besoin des StringBuffer et par habitude on n'utilise jamais les StringBuilder.
    On a 4 process Unix qui tournent ensemble et chacun peut déclancher jusqu'a 16 threads. Quand un user fait une grosse requête on dispatch tout ça pour aller le plus vite possible. Il faut bien recoller les morceaux une fois que tout le monde a fini

  16. #16
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    @Jimmy_ : tu manipules vraiment un même StringBuffer depuis plusieurs threads !?

    a++

  17. #17
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    765
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 765
    Points : 1 037
    Points
    1 037
    Par défaut
    Oui le but est d'envoyer plein de requête en même temps.

  18. #18
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Par curiosité : c'est quoi comme appli ? Tu en fait quoi de ton StringBuffer ?

    a++

  19. #19
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    765
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 765
    Points : 1 037
    Points
    1 037
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Par curiosité : c'est quoi comme appli ? Tu en fait quoi de ton StringBuffer ?

    a++
    C'est un produit pour la finance , le temps de réponse est critique, on attaque des bases Oracles sur des serveurs mutualisés. Il y a des StringBuffers qui récupèrent les données des threads qui ont réussit a récupérer leur résultat.
    Comme toujours avec Java, il y a des tonnes de truc qu'on utlise jamais , mais un jour ça sert ...

  20. #20
    Expert éminent sénior
    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 : 45
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    oui donc les cas d'usage sont donc limites. Puisque de toutes facons, stringbuffer ne fait que garantir la durabilité en multi thread, quand plusieurs thread écrivent, ca reste quand même écrit dans n'importe quel ordre , donc l'usage reste limité aux cas où on peut se permetre un ordre quelconque.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Instancier une class a partire d'une variable string
    Par Assimil dans le forum ASP.NET
    Réponses: 7
    Dernier message: 25/06/2008, 16h47
  2. Instancier une classe dont le nom est contenu dans une String
    Par fyque dans le forum Général Python
    Réponses: 15
    Dernier message: 13/06/2008, 12h33
  3. [JAR]Instancier une classe d'un jar
    Par Foub dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 16/08/2005, 15h10
  4. [Débutant(e)]Instancier une classe connaissant son nom (String)
    Par Invité dans le forum API standards et tierces
    Réponses: 5
    Dernier message: 17/06/2005, 11h05
  5. [Débutant(e)]servlet qui instancie une classe personelle
    Par NiBicUs dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 08/02/2005, 12h00

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