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

Collection et Stream Java Discussion :

Map et redéfinition du equals et hashCode


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de jojodu31
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    875
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2008
    Messages : 875
    Par défaut Map et redéfinition du equals et hashCode
    Bonjour à tous,
    je me posais une petite question.
    On est d'accord que tous les objets que l'on utilise en clé d'une Map doivent redéfinir les méthode equals(..) et hashCode().

    Maintenant si j'ai un object C en clé de ma Map, et que celui ci contient deux attributs de type AttributA et AttributB
    AttributA et AttributB ne redéfinissent pas les 2 méthodes en question.
    Est-ce que ça va changer quelque chose chose si je redéfini les 2 méthodes equals et hashCode ?

    En effet des mon equals et mon hashcode je vais appeler les même méthodes sur AttributA et AttributB qui eux n'ont rien redéfini... d'où ma question => est-ce que ça va changer grand chose niveau perf de redéfnir les méthodes dans mon objet C ?

    Merci d'avance

  2. #2
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2008
    Messages
    1 190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 190
    Par défaut
    Le mieux est encore que tu fasses le test.

    En théorie oui ça change, l'exécution du equals a bien évidemment un cout, et donc redéfinir ces méthodes a théoriquement un impact, positif ou négatif.

    En pratique, je pense pas qu'on peut obtenir un gain significatif en surchargeant ces méthodes.

  3. #3
    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 jojodu31 Voir le message
    d'où ma question => est-ce que ça va changer grand chose niveau perf de redéfnir les méthodes dans mon objet C ?
    Ce n'est pas uniquement uen question de performance. Il faut impérativement redéfinir ces méthodes pour que la Map retrouve ses petits. Si tu ne le fais pas tu risques de "perdre" des éléments.

    Si tes attributs ne définissent ni hashCode ni equals, tu devras implémenter cela toi même pour gérer l'unicité de tes clef.


    a++

    PS : Par curiosité quel est ce type clef que tu utilises ?

  4. #4
    Membre émérite Avatar de jojodu31
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    875
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2008
    Messages : 875
    Par défaut
    ok, en fait j'utilise un objet métier (pas le choix) dans une table de 10000 éléments (dans le pire cas).

    En fait je posais la question car mes attributs sont encore des objets métier et du coup ils héritent eux aussi d'autres classe qui n'implémentent toujours pas equals() ni hashcode()... je vais donc devoir me farcir toutes les implémentations jusqu'au plus haut niveau ?

  5. #5
    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
    ... Ou alors tu l'implémente uniquement dans ton objet de plus haut niveau, celui qui sert de clé, et tu y implémente comment calculer le hashCode() et le equals() de tout ce qu'il peut contenir.

    Mais en principe, oui, on redéfinit hashCode() et equals() pour tout le monde, dès lors qu'il y a une chance qu'on s'en serve. C'est quelque chose à penser pour la moindre création de nouvelle classe de données.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre émérite Avatar de jojodu31
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    875
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2008
    Messages : 875
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Mais en principe, oui, on redéfinit hashCode() et equals() pour tout le monde, dès lors qu'il y a une chance qu'on s'en serve. C'est quelque chose à penser pour la moindre création de nouvelle classe de données.
    tout à fait d'accord...mais tu sais ce que c'est t'arrives sur le projet et bien souvent tu reprends l'existant...

    je vais essayer de faire implémenter ces méthodes partout, y a du boulot


    Si je peux me permettre il faut utiliser le getClass() plutôt que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ! other instanceof ClasseA

  7. #7
    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
    Citation Envoyé par jojodu31 Voir le message
    tout à fait d'accord...mais tu sais ce que c'est t'arrives sur le projet et bien souvent tu reprends l'existant...
    Ben, ça s'appelle devoir corriger les merdes du code existant.
    Ou alors, peut-être que c'est une aberration de chercher à utiliser les classes existantes comme des clés, c'est possible aussi.

    Citation Envoyé par jojodu31 Voir le message
    Si je peux me permettre il faut utiliser le getClass() plutôt que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ! other instanceof ClasseA
    Tu peux certainement te le permettre, mais je suis curieux de savoir pourquoi il faudrait ça.
    Tu as un exemple, et une explication d'en quoi c'est mieux ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    D'une manière générale, toujours redéfinir equals et hashCode. Ça évitera les mauvaises surprises le jour où quelqu'un voudra faire une HashMap contenant ces objets.

    Maintenant, si ta ClasseC a des attributs de ClasseA et ClasseB, tu n'as pas forcément à redéfinir equals et hashCode sur ces deux classes : ça dépend entièrement de si les attributs en question sont utilisés pour la fonction equals de classeC.

    Par exemple :
    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
     
    public classeC {
      private ClasseA attributA;
      private ClasseB attributB;
      private int id;
     
      [...]
     
      public boolean equals(Object other) {
         if (! other instanceof ClasseA) return false;
         if (other == this) return true;
         ClasseA otherA = (ClasseA) other;
         return otherA.id == this.id;
      }
     
      public int hashCode() {
          return this.id;
      }
    }
    Dans cet exemple, pas la peine pour faire "fonctionner" equals et hashcode de redéfinir ceux de ClasseB et ClasseC. Il n'empêche que ça serait quand même franchement souhaitable !

Discussions similaires

  1. Redéfinition de equals
    Par robert_trudel dans le forum Débuter avec Java
    Réponses: 18
    Dernier message: 26/05/2008, 14h11
  2. Réponses: 0
    Dernier message: 26/11/2007, 15h47
  3. Modifier le template de equals et hashCode
    Par Baptiste Wicht dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 13/04/2007, 15h26
  4. [Optim Code]equals and hashCode are not paired
    Par anitshka dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 15/09/2006, 23h25
  5. Redéfinition de equals
    Par eureka dans le forum Langage
    Réponses: 15
    Dernier message: 21/04/2006, 21h25

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