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 :

[Java 5 ]Question sur le Runtime et compilation String


Sujet :

avec Java

  1. #1
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    265
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 265
    Points : 98
    Points
    98
    Par défaut [Java 5 ]Question sur le Runtime et compilation String
    Bonjour
    String literals are created at compile time, and the compiler does not create a duplicate String literal. The strings with the new operator are created at runtime, and a new string will be created even if there is an identical string already in the pool created at compile time.
    je dois passer une certif bientôt, et il y a quelque chose qui m'échappe. Comment peut on faire la différence entre la compilation, et le runtime. J'avoue que c'est une notion qui m'échappe encore.. C'est souvent face à ce genre de question que je sèche. Alors je ne sais pas si c'est basique où pas, en tout cas, je suis convaincu, qu'il se trouvera des personnes pour connaître la réponse.

    Bien à vous.

  2. #2
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Points : 19 450
    Points
    19 450
    Par défaut
    Salut.

    J'avais appris que le Java était d'abord compilé en bytecode qui lui était ensuite interprété (exécuté donc, d'où le terme de runtime) par le JRE (une machine virtuelle, le Java Runtime Environement).

    Sauf qu'il n'y a pas longtemps j'ai vaguement entendu parler du JIT (Just-in-time) sur les nouvelles JVM (Java virtual machine) ... Enfin bref, d'autres sauront surement t'en dire plus, et tu peut te renseigner dessus à l'aide d'une recherche.

    En espérant t'avoir aidé.

  3. #3
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 635
    Points
    21 635
    Par défaut
    Citation Envoyé par ok.Idriss Voir le message
    J'avais appris que le Java était d'abord compilé en bytecode qui lui était ensuite interprété (exécuté donc, d'où le terme de runtime) par le JRE (une machine virtuelle, le Java Runtime Environement).
    Précisément.

    Le compile-time c'est le moment où on transforme les fichiers code source .java en fichiers binaires .class, contenant le bytecode compilé.

    Le runtime c'est le moment où le programme est exécuté, en utilisant les fichiers .class. À ce moment-là, le code source n'est plus utilisé.

    En ce qui concerne le JIT, c'est juste la manière utilisée pour exécuter du Java avec de bonnes performances. Ça ne nous regarde pas, la manière employée. Le runtime, c'est le runtime, point.

  4. #4
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    265
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 265
    Points : 98
    Points
    98
    Par défaut
    Bonjour et merci pour vos réponses.
    Dans la définition chez Sun j'ai :
    String literals are created at compile time, and the compiler does not create a duplicate String literal. The strings with the new operator are created at runtime, and a new string will be created even if there is an identical string already in the pool created at compile time.
    Finalement je ne comprend plus, donc une chaine est crée pendant la compilation
    quand je fais String c="unechaine";
    En gros en faisant javac classe.java. donc dans le .class
    Et une autre chaine est crée en fait en faisant lorsque je fais
    String x = new String("qqch");
    java classe.class ?
    Je ne comprend pas vos réponse, c'est pas trés claire pour moi.
    Auriez vous un schéma pour illustrer ce que vous dîtes ?

    Bien à vous.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2008
    Messages : 338
    Points : 402
    Points
    402
    Par défaut
    Je te traduit ton texte:
    Quand tu crée un String en l'affectant à un litteral alors le compilateur crée une et une seule instance. càd
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    String s1 = "abc";
    String s2 = "abc";
    Les références s1 et s2 sont identique (s1 == s2) car le compilateur affecte la même référence aux 2 variables (D'où le pool: littérals <-> références String).
    Sinon: Quand tu crée un String avec un new càd
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String s = new String("abc");
    Le compilateur crée cette référence à l'exécution et n'attribue pas l'adresse à la compilation..

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 635
    Points
    21 635
    Par défaut
    Citation Envoyé par smutmutant2003 Voir le message
    String x = new String("qqch");
    Ça, la plupart du temps c'est une aberration. Mais en résumé, il y a deux objets String dans cette ligne.

    D'abord l'objet String créé à la compilation du fait d'avoir utilisé le littéral "qqch".

    Ensuite, un autre objet String, créé au runtime, qui contient aussi le texte qqch, et qui est créé du fait du mot-clé "new."

    En général ça ne sert à rien. On devrait logiquement faire String x = "qqch";

    Quand on appelle le constructeur d'une classe, avec "new" donc, on crée toujours un nouvel objet. En fait c'est exactement ce que veut dire un constructeur. Mais on n'a pas toujours besoin de le faire. Avec les String c'est même rare.
    L'intérêt de faire new String("qqch") est mince. En gros, ça crée un objet String, qui contient le texte qqch, mais qui renvoie false si on le compare à "qqch" ou à n'importe quel objet autre que lui-même.

    Pour illustrer :

    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
    21
    22
    23
    24
    String s1 = "qqch";
    String s2 = new String("qqch");
     
    if(s1 == "qqch") {
      System.out.println("s1 et 'qqch' sont identiques.");
    }
    if(s2 == "qqch") {
      System.out.println("s2 et 'qqch' sont identiques.");
    }
    if(s1 == s2) {
      System.out.println("s1 et s2 sont identiques.");
    }
    if("qqch" == "qqch") {
      System.out.println("'qqch' et 'qqch' sont identiques.");
    }
    if(s1.equals("qqch")) {
      System.out.println("s1 et 'qqch' sont égaux.");
    }
    if(s2.equals("qqch")) {
      System.out.println("s2 et 'qqch' sont égaux.");
    }
    if(s1.equals(s2)) {
      System.out.println("s1 et s2 sont égaux.");
    }
    On voit que s1 et s2 contiennent la même chose, mais sont des objets différents. De plus, s1 est l'objet créé à la compilation avec le littéral "qqch".

  7. #7
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    265
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 265
    Points : 98
    Points
    98
    Par défaut
    Citation Envoyé par hibour Voir le message
    Le compilateur crée cette référence à l'exécution et n'attribue pas l'adresse à la compilation..
    Un objet n'importe qu'elle qu'il soit, ne réside-t-il pas sur le tas ? où Heap en anglais.
    Hibour voudriez vous dire qu'il éxiste deux tas ? Un pendant la compilation, et l'autre pendant l'éxécution ?
    Ca complique les choses pour les String ..

  8. #8
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Ça, la plupart du temps c'est une aberration. Mais en résumé, il y a deux objets String dans cette ligne.

    D'abord l'objet String créé à la compilation du fait d'avoir utilisé le littéral "qqch".

    Ensuite, un autre objet String, créé au runtime, qui contient aussi le texte qqch, et qui est créé du fait du mot-clé "new."

    En général ça ne sert à rien. On devrait logiquement faire String x = "qqch";

    Quand on appelle le constructeur d'une classe, avec "new" donc, on crée toujours un nouvel objet. En fait c'est exactement ce que veut dire un constructeur. Mais on n'a pas toujours besoin de le faire. Avec les String c'est même rare.
    L'intérêt de faire new String("qqch") est mince. En gros, ça crée un objet String, qui contient le texte qqch, mais qui renvoie false si on le compare à "qqch" ou à n'importe quel objet autre que lui-même.

    Pour illustrer :

    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
    21
    22
    23
    24
    String s1 = "qqch";
    String s2 = new String("qqch");
     
    if(s1 == "qqch") {
      System.out.println("s1 et 'qqch' sont identiques.");
    }
    if(s2 == "qqch") {
      System.out.println("s2 et 'qqch' sont identiques.");
    }
    if(s1 == s2) {
      System.out.println("s1 et s2 sont identiques.");
    }
    if("qqch" == "qqch") {
      System.out.println("'qqch' et 'qqch' sont identiques.");
    }
    if(s1.equals("qqch")) {
      System.out.println("s1 et 'qqch' sont égaux.");
    }
    if(s2.equals("qqch")) {
      System.out.println("s2 et 'qqch' sont égaux.");
    }
    if(s1.equals(s2)) {
      System.out.println("s1 et s2 sont égaux.");
    }
    On voit que s1 et s2 contiennent la même chose, mais sont des objets différents. De plus, s1 est l'objet créé à la compilation avec le littéral "qqch".
    Tu devrais également mettre la trace écrite par ton programme, car à la première lecture, je pensais que tu ne comprenais rien à la gestion des String en Java. A la seconde lecture, j'ai compris que tu avais compris
    Donc ajoute le résultat du programme pour que ce soit bien clair pour tout le monde

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2008
    Messages : 338
    Points : 402
    Points
    402
    Par défaut
    En java tous les objets réside dans le heap à part les arguments d'une méthode appelé qui eux sont dans la pile si je ne me trompe pas.
    Le code généré va faire en sorte d'allouer une seule fois les littérals (Pool) c'est tout ce que je peux te dire.

  10. #10
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 621
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 621
    Points : 15 704
    Points
    15 704
    Par défaut
    A noter qu'il le fait quand il peut le faire simplement mais il n'y a pas de garantie absolue qu'il le fasse. Donc, il faut toujours garder a l'esprit qu'un comparaison entre string n'est pas fiable.

    Si on veut l'obliger a utiliser le pool de string, il faut utiliser intern() .

  11. #11
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    265
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 265
    Points : 98
    Points
    98
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Ça, la plupart du temps c'est une aberration.
    En général ça ne sert à rien. On devrait logiquement faire String x = "qqch";
    Avec les String c'est même rare.
    L'intérêt de faire new String("qqch") est mince.
    Thelvin vous parlez à un convaincu, je vais même rajouter, que je n'ai jamais dans ma carrière de programmeur utiliser un new String("qqch");
    Si c'était pas les exams de type scjp, pour nous emmerder, et que je dois passer trés bientôt, je n'aurai jamais posé ce genre de question. C'est pas avec ces kholes que l'on peut juger un programmeur, loin s'en faut, mais que voulez vous .

    Toutefois je pense avoir compris vos réponses. Je vous remercie tous pour vos contributions.

  12. #12
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    Pour le constructeur de String, il a une utilité : http://blog.developpez.com/adiguba/p...string-string/

    Citation Envoyé par hibour Voir le message
    En java tous les objets réside dans le heap à part les arguments d'une méthode appelé qui eux sont dans la pile si je ne me trompe pas.
    Le code généré va faire en sorte d'allouer une seule fois les littérals (Pool) c'est tout ce que je peux te dire.
    En fait en Java pour le moment (avant Java 7 et son escape-analysis) , seules les variables de type primitif et les références vers les paramètres (pas les valeurs elles-mêmes, seulement les paramètres) et les références vers les variables locales sont sur la pile.

  13. #13
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 635
    Points
    21 635
    Par défaut
    Citation Envoyé par Baptiste Wicht Voir le message
    Pour le constructeur de String, il a une utilité : http://blog.developpez.com/adiguba/p...string-string/
    Yup, mais ça ne s'applique pas aux littéraux. Et puis, ça reste un cas qui ne s'applique que dans des cas d'utilisations assez précis.

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2008
    Messages : 338
    Points : 402
    Points
    402
    Par défaut
    Citation Envoyé par Baptiste Wicht Voir le message
    .. seules les variables de type primitif et les références vers les paramètres (pas les valeurs elles-mêmes, seulement les paramètres) et les références vers les variables locales sont sur la pile.
    Je n'ai jamais dit qu'on met la valeur de l'objet dans la pile , Comme le passage de paramètres des objets se fait par référence alors c'est une évidence qu'on transmet que la référence via la pile..
    A++

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2008
    Messages : 338
    Points : 402
    Points
    402
    Par défaut
    Citation Envoyé par Uther Voir le message
    A noter qu'il le fait quand il peut le faire simplement mais il n'y a pas de garantie absolue qu'il le fasse. Donc, il faut toujours garder a l'esprit qu'un comparaison entre string n'est pas fiable.

    Si on veut l'obliger a utiliser le pool de string, il faut utiliser intern() .
    Si c'est fiable même des littéral qui sont déclarer dans deux classes distinctes (chargé par le même ClassLoader).

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 15/11/2010, 21h13
  2. [Java] Diverses questions sur la certification Java
    Par dingoth dans le forum Certifications
    Réponses: 1
    Dernier message: 03/11/2008, 20h53
  3. Réponses: 51
    Dernier message: 20/10/2006, 16h52
  4. question sur le Runtime
    Par grenet dans le forum Runtime
    Réponses: 2
    Dernier message: 08/06/2006, 17h11
  5. question sur les erreurs de compilation
    Par vince3320 dans le forum C
    Réponses: 5
    Dernier message: 19/04/2004, 11h34

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