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 :

[POO] symbole "==" et equals()


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 34
    Par défaut [POO] symbole "==" et equals()
    Bonjour.

    Je sais que lorsque l'on compare deux objets avec le symbole ==, cela ne vaut VRAI que lorsque les deux objets sont en fait la même instance. Je sais aussi que la méthode equals dans la classe Object fait par défaut un == si elle n'est pas redéfinie, du coup, si je veux que equals compare mes objets par rapport à leurs attributs, je dois la redéfinir.

    Mais là où je bloque, c'est avec les Strings. J'ai le code suivant :
    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
     
    class Main {
     
        public static void main(String[] args) {
            String s = new String("Blabla");
            String v = new String("Blabla");
     
            System.out.println(s.hashCode());
            System.out.println(v.hashCode());
     
            if (s == v)
                System.out.println("s et v sont égales");
            if (s.equals(v))
                System.out.println("s et v sont égales sémantiquement");
     
     
     
        }
    }
    Ce code m'affiche en terminal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    1992251584
    1992251584
    s et v sont égales sémantiquement
    Je ne comprends pas pourquoi il rentre dans le second if. J'ai utiliser la déclaration new String, donc s et v ne sont pas les mêmes instances. Du coup, je ne rentre pas dans le premier if, mais je ne devrai pas non plus rentrer dans le second, vu que equals fait par défaut un ==.
    Pouvez-vous m'expliquer ?

    merci

  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 Compassio Voir le message
    Je sais que lorsque l'on compare deux objets avec le symbole ==, cela ne vaut VRAI que lorsque les deux objets sont en fait la même instance.
    Plus précisément, == compare la valeur des références.
    Ainsi pour deux références a et b, a==b est vrai seulement si a et b pointent sur la même instance en mémoire.


    Citation Envoyé par Compassio Voir le message
    vu que equals fait par défaut un ==.
    La classe String redéfinie equals()/hashCode() de manière approprié.
    Et heureusement sinon ce serait complètement inutile...


    a++

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 34
    Par défaut
    Merci pour ta réponse

    Donc la référence est bien unique pour chaque instance ? Si deux objets sont strictement identique, ça veut dire qu'ils pointent vers la même adresse mémoire ?

    Référence et pointeurs sont synonymes ? Je n'ai jamais rencontré la notion de pointeur auparavant.

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    La notion de pointeur représente une entité (variable par exemple, ou notation) qui contient (ou représente) la référence d'une zone mémoire dans les langages qui ont cette notion (C, pascal...). En Java, pas de notion de pointeur. Mais les objets sont bien stockés en mémoire et ont donc une référence unique par instance. La référence en Java est une sorte d'adresse dans un référentiel interne à la JVM, propre à Java. On dit qu'une variable pointe vers un objet, mais c'est une façon de dire que la variable a pour valeur la référence de cet objet.

    Citation Envoyé par Compassio Voir le message
    Si deux objets sont strictement identique, ça veut dire qu'ils pointent vers la même adresse mémoire ?
    Les objets ne pointent pas. Et deux objets ne peuvent pas être identiques : c'est un objet unique dans ce cas. Ce sont les valeurs dans les variables qu'on compare par ==. Ces valeurs peuvent être identiques et, dans ce cas, les 2 variables pointent bien vers le même objet (contiennent la même référence d'objet).

    Attention à hashcode() :
    • ce n'est pas forcément une référence
    • si 2 objets vérifiant equals() doivent avoir le même hashcode, 2 objets ne vérifiant pas equals() peuvent avoir le même hashcode
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 34
    Par défaut
    Merci à toi.

    J'en profite pour rebondir sur un dernier point, je ne comprends pas très bien à quoi sert cette fonction hashcode().

    Ce que je sais, c'est qu'elle permet de donner un sorte de code à un objet, en effectuant des calculs en fonction de ses attributs. Mais j'ai lu que le hashcode n'était pas unique pour chaque objet, et que certains objets peuvent partager le même hashcode, du coup je ne comprend pas l'intérêt, peux-tu m'expliquer s'il te plaît ?

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    le hashcode sert à toutes les classes qui ont besoin de pouvoir organiser grossièrement des objets. Comme deux objets ayant un hashcode différent ne peuvent pas être equals, ça permet de faire des comparaison rapides qui éliminent une grande partie des collisions. Il faut toujours ensuite passer dans equals pour bien vérifier lorsque les hascode sont identique, mais si ils sont différents on n'en pas besoin. Exemple, un HashSet de 5000 entrées. On veut savoir si l'objet X existe dans le Set. On prend X.hashCode(), on regarde à l'entrée correspondante dans la table de hashage: c'est vide. On peux retourner false avec une seule comparaison au lieu de 5000. On a deux entrée à ce hash: on les compares tous les deux à X via equals: on sait si X est dans le Set avec seulement 3 comparaisons au lieu de 5000.

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

Discussions similaires

  1. [PHP 5.3] [POO] : faire une fonction quote
    Par gwendoline-bricout dans le forum Langage
    Réponses: 7
    Dernier message: 20/02/2014, 11h41
  2. Réponses: 2
    Dernier message: 12/04/2011, 15h37

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