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 :

Optimisation du compilateur ?


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2007
    Messages
    697
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 697
    Par défaut Optimisation du compilateur ?
    Bonsoir,
    lorsque je fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    String a = "hello";
    String b = "hello";
    System.out.println(a == b);
    il m'affiche "true". Donc a priori, le compilateur décide de créer un seul objet. Est-ce que ce n'est pas dangereux ? Même si les String sont immuable, je me pose la question. D'autant que si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    String a = new String("hello");
    String b = new String("hello");
    System.out.println(a == b);
    alors il m'affiche "false". pourquoi on optimise pas ici aussi ?

  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,

    Citation Envoyé par atha2 Voir le message
    il m'affiche "true". Donc a priori, le compilateur décide de créer un seul objet.
    Oui ! Enfin le couple compilateur/machine virtuelle plus exactement.

    On appelle ceci une "String literal", c'est à dire une chaine directement présente dans le code. Lors de l'exécution des objets de type String sont créé mais ils sont "internés", et les valeurs égales sont partagées par toutes les instances...

    [edit] Plus d'info : http://java.sun.com/docs/books/jls/t...al.html#3.10.5

    Citation Envoyé par atha2 Voir le message
    Est-ce que ce n'est pas dangereux ? Même si les String sont immuable, je me pose la question.
    Non ce n'est pas vraiment dangereux. Il n'y a que la réflection qui pourrait changer la valeur d'une String, mais en environnement protégé cela peut être empêché via un SecurityManager, et le code est suffisamment "complexe" pour que ce ne soit pas une simple erreur...



    Citation Envoyé par atha2 Voir le message
    pourquoi on optimise pas ici aussi ?
    Il optimise aussi ! En fait tu as 3 objets car c'est comme si tu faisais ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    String hello = "hello";
    String a = new String(hello);
    String b = new String(hello);
    Le couple compilateur/JVM optimise bien les "hello" mais ne peut pas modifier ton code (tu créés explicitement deux objets en copie).

    a++

  3. #3
    Membre très actif
    Inscrit en
    Mars 2008
    Messages
    283
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 283
    Par défaut
    Pour tester une égalité (en valeur et non en référence), il est préférable d'utiliser la méthode Object.equals(Object obj)

  4. #4
    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
    Petite "correction" :
    Citation Envoyé par Grimly
    Pour tester une égalité (en valeur et non en référence), il faut d'utiliser la méthode Object.equals(Object obj)
    Mis à part pour les enums (qui sont un type à part), la comparaison des valeurs des objets se fait via la méthode equals().


    a++

Discussions similaires

  1. Réponses: 5
    Dernier message: 24/08/2011, 10h13
  2. Optimisations du compilateur ocamlopt
    Par Blustuff dans le forum Caml
    Réponses: 7
    Dernier message: 30/08/2010, 13h57
  3. Optimisation du compilateur .net
    Par jeromechezgdf dans le forum Général Dotnet
    Réponses: 11
    Dernier message: 09/07/2007, 16h30
  4. Débogage corrompu par les optimisations du compilateur
    Par petitcoucou31 dans le forum EDI
    Réponses: 6
    Dernier message: 17/12/2003, 00h30

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