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 :

Petite question existentielle (hum hum)


Sujet :

Langage Java

  1. #1
    Membre confirmé Avatar de Emplyst
    Inscrit en
    Mars 2006
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 152
    Par défaut Petite question existentielle (hum hum)
    Bon lundi a vous!
    Voila en lisant mon livre en ce beau lundi matin dans mon cubicule une question existentielle m'est venu a l'esprit.

    Hormis quelques differences tel que la comparaison avec null, quel est l'utilite de faire un .equal alors qu'un .hashCode revient au meme.

    Donc la question est equal ou hashCode ou tous deux, la est la question.

    (Aportez quelques arguments je suis pas trop fan des axiomes )

  2. #2
    Membre expérimenté
    Inscrit en
    Juillet 2004
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 152
    Par défaut
    Citation Envoyé par Emplyst
    quel est l'utilite de faire un .equal alors qu'un .hashCode revient au meme.
    Faux...
    a.equals(b) == true implique a.hashCode() == b.hashCode() mais la réciproque n'est pas vraie.

    Et rien n'empeche d'avoir a.equals(b) == false et a.hashCode() == b.hashCode()

  3. #3
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Si ça peut d'aider dans ton dileme, la doc de la méthode equals() nous dit :
    Citation Envoyé par javadoc
    Note that it is generally necessary to override the hashCode method whenever this method is overridden, so as to maintain the general contract for the hashCode method, which states that equal objects must have equal hash codes.
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  4. #4
    Membre émérite Avatar de yann2
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 897
    Par défaut
    Bonjour

    Trouvé dans la Javadoc de hashCode :

    Citation Envoyé par javadoc
    It is not required that if two objects are unequal according to the equals(java.lang.Object) method, then calling the hashCode method on each of the two objects must produce distinct integer results. However, the programmer should be aware that producing distinct integer results for unequal objects may improve the performance of hashtables.
    [edit]
    en gros deux objets dont la méthode equals retourne false peuvent avoir la même valeur pour hashCode
    [/edit]

    et voilà

  5. #5
    Membre confirmé Avatar de Emplyst
    Inscrit en
    Mars 2006
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 152
    Par défaut
    en gros deux objets dont la méthode equals retourne false peuvent avoir la même valeur pour hashCode
    Mouais d'accord mais je vois mal l'interet :]

    Bref merci a vous tous, disons que l'aspect le plus interessant dans toutes les reponses recue est ce passage :
    "However, the programmer should be aware that producing distinct integer results for unequal objects may improve the performance of hashtables."

    Encore une fois merci de la rapidite de vos reponses!

  6. #6
    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 Emplyst
    en gros deux objets dont la méthode equals retourne false peuvent avoir la même valeur pour hashCode
    Mouais d'accord mais je vois mal l'interet :]
    Tout simplement parce que la méthode hashcode() renvoit un int, et que tu ne peux pas forcément représenter toutes les valeurs possibles...

    Les int peuvent prendre les valeurs allant de Integer.MIN_VALUE à Integer.MAX_VALUE (soit -2147483648 à 2147483647), soit un peu plus de quattre milliard de valeurs. Or si tu prend le cas des String, tu as un nombre infini de possibilitée (il suffit d'ajouter une lettre pour créer une nouvelle chaine différente).

    Tu ne peux donc pas forcément utiliser un int pour représenter ton objet de manière unique. Et c'est d'autant plus vrai si ton objet contient un grand nombre d'attribut à prendre en compte...

    Citation Envoyé par Emplyst
    Bref merci a vous tous, disons que l'aspect le plus interessant dans toutes les reponses recue est ce passage :
    "However, the programmer should be aware that producing distinct integer results for unequal objects may improve the performance of hashtables."
    Disons que ceci est vrai dans le meilleure des mondes... mais il ne faut pas prendre cela pour une réalité ou un objectif à atteindre.

    Il faut bien se souvenir que l'unique objectif des hashCode() est d'améliorer le stockage dans les tables de hashage, et en aucun cas de garantir l'égalité de deux objets...

    a++

  7. #7
    Membre confirmé Avatar de Emplyst
    Inscrit en
    Mars 2006
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 152
    Par défaut
    Merdi adiGuba cette reponse viens combler ma soif de savoir

  8. #8
    Membre éprouvé Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Par défaut
    bonjour,

    je viens de faire quelques tests suite aux posts precedents sur la methode equals, et je viens de m'apercevoir que lorsque je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    MyObject obj1 = new MyObject();
    MyObject obj2 = new MyObject();
     
    obj1 == obj2
    je ne passe jamais dans la méthode "equals" (que j'ai surchargé bien comme il faut normalement)...
    Je croyais que cette méthode opérait comme une surcharge d'operateur ?(comme en C++ par exemple)

    Est-ce que je fais une boulette ou est-ce normal ?

  9. #9
    Membre confirmé Avatar de Emplyst
    Inscrit en
    Mars 2006
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 152
    Par défaut
    Selon ce que j'ai lu la surcharge des operateurs ne sont pas pris en compte en java et ce prochain test est venu me le confirmer:

    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
    25
    26
    27
    28
    29
    30
    31
     
    //DummyObject.java
     
    public class DummyObject
    {
        //fields
        private int dummyNumber;
     
        //constructors
        public DummyObject(int dummyNumber)
        {
            this.dummyNumber = dummyNumber;
        }
     
        public DummyObject()
        {
            this(0);
        }
     
        @Override public boolean equals(Object otherObject)
        {
            if (this == otherObject) return true;
            if (otherObject == null) return false;
     
            if (getClass() != otherObject.getClass()) return false;
     
            DummyObject other = (DummyObject)otherObject;
     
            return this.dummyNumber == other.dummyNumber;
        }
    }
    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
     
    //DummyTest.java
     
    public class DummyTest
    {
        public static void main(String[] args)
        {
            DummyObject dummy1 = new DummyObject();
            DummyObject dummy2 = new DummyObject();
            DummyObject dummy3 = new DummyObject(1);
            DummyObject dummy4 = new DummyObject(-1);
     
            System.out.println(dummy1 == dummy2);       //retourne false
            System.out.println(dummy1.equals(dummy2));  //retourne true
            System.out.println(dummy3 == dummy4);       //retourne false
            System.out.println(dummy3.equals(dummy4));  //retourne false
        }
    }

  10. #10
    Membre chevronné Avatar de NeptuS
    Profil pro
    Inscrit en
    Août 2005
    Messages
    392
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2005
    Messages : 392
    Par défaut
    Citation Envoyé par BainE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    MyObject obj1 = new MyObject();
    MyObject obj2 = new MyObject();
     
    obj1 == obj2
    Est-ce que je fais une boulette ou est-ce normal ?
    Moi .. je dirais mégaboulette

    En faisant obj1 == obj2, tu compare deux pointeurs (et non deux valeurs), c'est à dire que tu vérifie que le pointeur obj1 pointe vers le même objet (adresse mémoire) que obj2. Ce qui n'est manifestement pas le cas.
    J'entend par là que si tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println(""+(obj1==obj2));
    tu verras s'inscrire false dans ta console.

    Cette ligne ne compare les valeurs que pour des types primitifs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int a = 0;
    int b = 2;
    if(a==b) Sytem.out.println("alors là, c'est mystique.");
    else Sytem.out.println("ici, c'est compréhensible.");
    voilou, ++

  11. #11
    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
    Citation Envoyé par NeptuS
    En faisant obj1 == obj2, tu compare deux pointeurs (et non deux valeurs),
    Tout à fait d'accord, mais j'aurais parlé de référence plutôt que de pointeur...

    En Java il n'y a pas de surcharge d'opérateur, mis à part l'opérateur + entre deux objets qui appelle implicitement leurs méthodes toString() (mais je ne sais pas si on peut appeller cela de la surcharge d'opérateur).

    a++

  12. #12
    Membre chevronné Avatar de NeptuS
    Profil pro
    Inscrit en
    Août 2005
    Messages
    392
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2005
    Messages : 392
    Par défaut
    au temps pour moi, merci adiGuba.

    En plus, je me suis fait coller sur cette question à mon entretien d'embauche :
    "Pouvez-vous me dire la différence entre un pointeur et une référence"

    glurps


    (shame on me !! )

  13. #13
    Membre confirmé Avatar de Emplyst
    Inscrit en
    Mars 2006
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 152
    Par défaut
    Alors c'est quoi

  14. #14
    Membre chevronné Avatar de NeptuS
    Profil pro
    Inscrit en
    Août 2005
    Messages
    392
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2005
    Messages : 392
    Par défaut
    le pointeur peut ne pointer vers aucune zone mémoire alors que la référence, elle, désigne forcément un objet en mémoire ....

    ... euu ... donc il s'agissait bien d'un pointeur en fait adiGuba

    tout est pointeur en Java
    Je l'invente pas

  15. #15
    Membre confirmé Avatar de Emplyst
    Inscrit en
    Mars 2006
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 152
    Par défaut
    *Voix de l'employeur*Oui d'accord mais ca pointe sur quoi alors Monsieur Neptus?

  16. #16
    Membre chevronné Avatar de NeptuS
    Profil pro
    Inscrit en
    Août 2005
    Messages
    392
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2005
    Messages : 392
    Par défaut
    *Voix du futur employé*
    Vous pouvez préciser votre question ? qu'est-ce qui pointe sur quoi ?

    La référence pointe 1 objet en mémoire (de manière certaine).
    Le pointeur pointe un objet en mémoire ... ou rien (null).

  17. #17
    Membre confirmé Avatar de Emplyst
    Inscrit en
    Mars 2006
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 152
    Par défaut
    Il n'y a pas de difference plus fondamentale? Comme par reference, refere a uine adresse memoire, alors un pointeur pointe quoi

  18. #18
    Membre chevronné Avatar de NeptuS
    Profil pro
    Inscrit en
    Août 2005
    Messages
    392
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2005
    Messages : 392
    Par défaut
    Citation Envoyé par NeptuS
    *Voix du futur employé*
    Vous pouvez préciser votre question ? qu'est-ce qui pointe sur quoi ?

    La référence pointe 1 objet en mémoire (de manière certaine).
    Le pointeur pointe un objet en mémoire ... ou rien (null).
    c'est pas clair ce que j'ai dit ?

    Citation Envoyé par Emplyst
    Il n'y a pas de difference plus fondamentale?
    Ben personnellement, je ne vois pas ce que tu pourrais y trouver de beaucoup plus fondamental. Et entre nous, la différence, si minime soit son explication, est tout de même importante.

    Entre une référence vers un objet et une référence vers un objet OU RIEN .... il y a un cap .... que dis-je .. une péninsule !!!

  19. #19
    Membre confirmé Avatar de Emplyst
    Inscrit en
    Mars 2006
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 152
    Par défaut
    Cyrano, C'est null comme référence! (jeux de mot ;D)

  20. #20
    Membre chevronné Avatar de NeptuS
    Profil pro
    Inscrit en
    Août 2005
    Messages
    392
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2005
    Messages : 392
    Par défaut
    t'as rien compris

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

Discussions similaires

  1. [Visuel XP] Petite question sur le theme XP...
    Par ZoumZoumMan dans le forum C++Builder
    Réponses: 12
    Dernier message: 20/01/2005, 15h41
  2. [CR8.5] petite question ..
    Par mcrocher dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 13/09/2004, 16h04
  3. Une petite question
    Par Etienne1 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 10/08/2004, 17h19
  4. [FOREIGN KEY] petite question bete ...
    Par dzincou dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 13/01/2004, 17h35
  5. Petite question sur les performances de Postgres ...
    Par cb44 dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 13/01/2004, 14h49

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