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 :

Wrapper et test de l'égalité


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de 0redd
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 141
    Par défaut Wrapper et test de l'égalité
    Bonjour
    Voilà je voudrais savoir si correcte de faire celà
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Integer i = 4;
    Integer j = 4;
    if( i == j ) {
       ...
    }
    j'ai lu que le compilateur pour gagné de la mémoire, créera juste une instance et donc i et j référence le même objet (4), et là l'égalité marche puisqu'on compare les référence,
    mais pourrai-t'on dire que c'est toujours le cas?
    et puis si on trouve cela dans un code, on devra toujours voir la déclaration de l'integer, car quand j'essaye, celà crée deux objets distinct ..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Integer i = new Integer(4);
    Integer j = Integer(4);
    if( i == j ) {
       ...
    }
    equals serai plus approprié dans ce cas ci??
    merci d'avance

  2. #2
    Membre émérite Avatar de Heimdal
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 549
    Par défaut
    J'ai pas vraiment compris la question mais tes remarques sont justes.

  3. #3
    Membre confirmé Avatar de 0redd
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 141
    Par défaut
    si on trouve i == j, on ne pourra pas dire si ça retourne true ou false?
    et puis ça risque de changé d'une machine virtuelle à une autre?
    et puis c'est le compilateur qui fait les optimisations?

  4. #4
    Membre Expert

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Par défaut
    Salut,

    Si ma mémoire est bonne c'est pas le compilateur qui fait ça mais le JRE (d'où la questions à se poser si c'est portable d'une JVM à l'autre).

    Bref entrons dans le vif du sujet. La JVM utilise le pattern flyweight pour effectivement faire des économies de mémoire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Integer i = 4;
    Integer j = 4;
    Maintenant si tu n'utilise plus de littéraux, et que tu explicite une nouvelle allocation alors tu as deux instances (en faire 3 avec le littéral).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Integer i = new Integer(4);
    Integer j = new Integer(4);
    Certainement que ce billet sur mon blog t'intéresseras : http://alaindefrance.wordpress.com/2...epresentation/ (en anglais)

  5. #5
    Membre confirmé Avatar de 0redd
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 141
    Par défaut
    c'est la jvm qui fait celà?
    la jvm ne fait pas qu'exécuter le byte code?
    sinon merci pour votre réponse

  6. #6
    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
    Alors, des précisions, tirées des JLS :

    - C'est en partie le compilateur, en partie la JVM qui font ça. Le compilateur ne peut pas instancier d'objet, et il n'a nulle part d'où référencer des Integer connus (seules les String ont un traitement particulier pour ça.) Mais il est tenu d'utiliser une instruction d'auto-inbox qui garantit que la JVM le fera correctement. (Je suppose qu'en pratique, c'est un appel à Integer.valueOf(), qui doit être considéré tenu d'implémenter ce comportement. Auquel cas, c'est aussi la bibliothèque de base qui le fait.)

    - Cela ne dépend pas quelle JVM utilisée : c'est dans les JLS, ça doit faire ça sinon c'est non-conforme.

    - Ce comportement est garanti pour les entiers de -128 à 127, mais pas pour les autres. Pour les autres, c'est bel et bien au choix de la JVM (et donc probablement de la bibliothèque de base.)


    Remarquons aussi qu'à partir du moment où on utilise le mot-clé new, on crée forcément une nouvelle instance. Il le garantit. C'est même à peu près ce à quoi il sert.
    (Bon, sauf si ça lance une exception, auquel cas il n'y a pas d'instance du tout, nouvelle ou pré-existante.)

    Edit :
    c'est la jvm qui fait celà?
    la jvm ne fait pas qu'exécuter le byte code?
    Techniquement si. Mais si on fait un abus de langage et qu'on veut dire JRE au lieu de JVM (la JRE étant la JVM, la bibliothèque de base, et quelques programmes exécutables en ligne de commande)...
    Si on parle de JRE au lieu de JVM, donc, ça marche :
    la JVM exécute le bytecode, et le bytecode en question est un appel à la bibliothèque de base qui se charge de faire l'auto-inbox.

    (Après essai, le compilateur d'Eclipse fait bel et bien un appel à Integer.valueof(int))
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre confirmé Avatar de 0redd
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 141
    Par défaut
    Ce comportement est garanti pour les entiers de -128 à 127, mais pas pour les autres. Pour les autres, c'est bel et bien au choix de la JVM (et donc probablement de la bibliothèque de base.)
    Quel comportement?
    la bibliothèque de base? (c'est quoi) ?
    sinon merci pour vos éclaircissement

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

Discussions similaires

  1. [RegEx] test de non égalité
    Par oraur dans le forum Langage
    Réponses: 1
    Dernier message: 28/10/2010, 13h22
  2. [JUnit] Test unitaire d'égalité de dates
    Par mehdi_swatch dans le forum Tests et Performance
    Réponses: 10
    Dernier message: 09/05/2006, 10h16
  3. [debutante][javacript]test sur une égalité de champs parsé
    Par anitshka dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 13/12/2005, 13h41
  4. [XSLT] Test égalité noeuds différents
    Par bruno782 dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 24/10/2005, 20h58
  5. [XSL] test égalité entre nodes
    Par luta dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 10/10/2005, 17h40

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