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 :

[Object ID]Comment identifier un objet de facon unique


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Inscrit en
    Avril 2003
    Messages
    159
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 159
    Par défaut [Object ID]Comment identifier un objet de facon unique
    Bonjour,

    Je dois stocker des objets dans une Map. La cle doit etre un identifiant unique de l'objet et la valeur l'objet lui meme.

    J'avais d'abord penser a utiliser la methode hashCode() pour determiner un identifiant de l'objet. Le probleme est je crois qu'elle est un peu couteuse, et mes objets sont assez monstreux. De plus si mes souvenirs sont bons deux objets differents peuvent avoir des hashCode identiques.
    Ma question est: est-ce qu'il existe une api (genre apache commons...), qui fournit des methodes permettant de generer des identifiants d'objets.

    J'espere avoir ete assez clair.

    Merci d'avance.

  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,


    Si tu ne l'as pas modifié, la méthode hashcode() hérité de Object fournit une valeur différente par instance (cela correspond même à l'adresse mémoire de l'objet avec les JVM de Sun).

    Tu peux récupérer cette valeur avec la méthode System.identityHashCode()...

    Je ne pense vraiment pas que ce soit coûteux en temps...

    a++

  3. #3
    Membre éprouvé
    Inscrit en
    Avril 2003
    Messages
    159
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 159
    Par défaut
    Le probleme est que deux objets identiques devraient me renvoyer un meme identifiant. Donc l'adresse memoire ne me suffit pas.

  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
    Citation Envoyé par bourbaki2003
    Le probleme est que deux objets identiques devraient me renvoyer un meme identifiant. Donc l'adresse memoire ne me suffit pas.
    Que veux-tu dire par identique ? identityHashcode() ne renvoit la même valeur que s'il s'agit de la même instance.

    a++

  5. #5
    Membre éprouvé
    Inscrit en
    Avril 2003
    Messages
    159
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 159
    Par défaut
    Par identique j'entends au sens de le methode equals.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    MyObject a = new MyObject();
    MyObject b = new MyObject();
    a == b renvoie false alors a.equals(b) renvoie true.

    Si je ne surcharge pas la methode hashCode, alors tu m'as dit qu'elle renvoyait l'adresse memoire de l'objet. Dans ce cas, a.hashCode() != b.hashCode()
    Alors que je voudrais qu'ils soient identiques.

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 137
    Par défaut
    Bonjour,

    sauf erreur de ma part, les hashcode de deux objets identiques sont identiques

    String s1 = new String("Hello World");
    String s2 = new String("Hello World");
    System.out.println ("Hashcode s1 = " + s1.hashCode());
    System.out.println ("Hashcode s2 = " + s2.hashCode());

    donne

    Hashcode s1 = -862545276
    Hashcode s2 = -862545276

  7. #7
    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 manitoba
    sauf erreur de ma part, les hashcode de deux objets identiques sont identiques
    C'est vrai lorsque la méthode hashCode() est correctement implémenté (ce qui est le cas pour String entre autre). Mais la méthode hashCode() de Object ne respectent pas cela, ou plutôt elle considère que tous les objets sont différents...

    Citation Envoyé par bourbaki2003
    Si je ne surcharge pas la methode hashCode, alors tu m'as dit qu'elle renvoyait l'adresse memoire de l'objet. Dans ce cas, a.hashCode() != b.hashCode()
    Alors que je voudrais qu'ils soient identiques.
    J'ai du mal à saisir ce que tu veux exactement ?
    • Un identifiant unique par instance ?
    • Un identifiant identique pour des instances différentes mais de même valeur ?
    a++

  8. #8
    Membre émérite
    Avatar de divxdede
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    525
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2004
    Messages : 525
    Par défaut
    Citation Envoyé par bourbaki2003
    Bonjour,

    Je dois stocker des objets dans une Map. La cle doit etre un identifiant unique de l'objet et la valeur l'objet lui meme.

    J'avais d'abord penser a utiliser la methode hashCode() pour determiner un identifiant de l'objet. Le probleme est je crois qu'elle est un peu couteuse, et mes objets sont assez monstreux. De plus si mes souvenirs sont bons deux objets differents peuvent avoir des hashCode identiques.
    Ma question est: est-ce qu'il existe une api (genre apache commons...), qui fournit des methodes permettant de generer des identifiants d'objets.

    J'espere avoir ete assez clair.

    Merci d'avance.
    Je suis perdu dans ce fils de discussion.

    Si tu veux retrouver une instance précise en fonction d'une autre instance qui aurrait la même valeur ( equals() parlant).
    Il te suffit d'1 chose:

    1) Que le hashCode() et equals() soient consistant. c'est a dire que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
         si "a.equals(b) == true" alors "a.hashCode() == b.hashCode()"
    donc tu dois apporter une attention particuliere a ces 2x méthodes

    Ensuite tes objets peuvent servir eux meme de clé au sein d'une Map ou directement mémorisé dans un HashSet par exemple.

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2006
    Messages : 124
    Par défaut
    Si tes objets sont si volumineux et qu'ils risquent d'avoir les mêmes valeurs tu peux aussi mettre un attribut représentant le nombre d'occurence.

    Bref tu pourrais calculer le hashcode de l'objet à ajouter. Si ce hashcode existe déjà tu modifies le nombre d'occurences de cet objet au lieu d'en créer un 2ème qui ne diffère que par son adresse mémoire...

    Pour ce qui est du hashcode, je ne sais pas exactement comment il fonctionne. Selon la doc, il n'est pas nécessaire que 2 objets différents aient 2 hashcode différents, ce qui me laisse perplexe. Ou alors j'ai pas compris la phrase:
    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.

  10. #10
    Membre émérite
    Avatar de divxdede
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    525
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2004
    Messages : 525
    Par défaut
    Citation Envoyé par yizashi
    Si tes objets sont si volumineux et qu'ils risquent d'avoir les mêmes valeurs tu peux aussi mettre un attribut représentant le nombre d'occurence.

    Bref tu pourrais calculer le hashcode de l'objet à ajouter. Si ce hashcode existe déjà tu modifies le nombre d'occurences de cet objet au lieu d'en créer un 2ème qui ne diffère que par son adresse mémoire...

    Pour ce qui est du hashcode, je ne sais pas exactement comment il fonctionne. Selon la doc, il n'est pas nécessaire que 2 objets différents aient 2 hashcode différents, ce qui me laisse perplexe. Ou alors j'ai pas compris la phrase:
    2x objets differents "equals() parlant" peuvent avoir le meme hashCode().
    Des collisiosn arriveront dans les HashMap, HashSet & co mais ce sera correctement géré. Ce sera moins efficace mais cela restera fonctionnelle.

    Par contre 2x objets identiques "equals() parlant" doivent avoir le meme hashCode() sous peine de problème dans l'utilisation de ces collections.

Discussions similaires

  1. Comment identifier une machine de manière unique ?
    Par jackfirst72 dans le forum Sécurité
    Réponses: 4
    Dernier message: 07/03/2007, 13h59
  2. Réponses: 2
    Dernier message: 30/01/2007, 09h02
  3. Réponses: 2
    Dernier message: 11/05/2006, 10h47
  4. Comment identifier une machine de facon unique ?
    Par BigBenQ dans le forum Développement
    Réponses: 14
    Dernier message: 19/12/2005, 08h36
  5. Comment mettre plusieurs objets ds un composant ?
    Par Fleury dans le forum Composants VCL
    Réponses: 7
    Dernier message: 24/05/2003, 17h34

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