web-dev-qa-db-fra.com

Utiliser une instance d'un objet comme clé dans hashmap, puis y accéder avec exactement un nouvel objet?

J'ai une hasmap avec un objet clé,

HashMap<Key, Object> test;

et créer une nouvelle clé ("la même") comme clé.

donc c'est comme ..:

test.put(new Key("the same"), someObject);

(sans stocker cette clé dans une variable)

alors .. après un certain temps ... je veux accéder à la table de hachage, parce que je n'ai pas l'objet, j'ai essayé de créer une nouvelle clé ("la même") et de la faire comme une clé. Mais cela n'a pas fonctionné.

Comment le faire fonctionner? (sans enregistrer le premier objet "clé" dans une variable)

Pendant ce temps, pour l'instant, j'utilise un objet String comme clé.

HashMap<String, Object>
36
Keenan Gebze

Vous devez implémenter hashCode et equals sur Key. implémentation par défaut de ces méthodes vérifie simplement l'instance l'égalité (en d'autres termes, deux Objects ne feront que être égaux s’ils sont en fait le même objet).

Lectures complémentaires

Efficace Java - Méthodes communes à tous les objets

62
Mark Peters

Votre problème est probable que Key n'a pas implémenté hashCode() et equals() correctement (ou pas du tout). Pour être utilisée comme clé HashMap, la classe doit implémenter ces deux méthodes pour refléter "l'égalité" de deux objets.

Si vous créez deux instances différentes avec

Key a = new Key("xyz");
Key b = new Key("xyz");

et attendez-vous à ce qu'ils soient égaux et fonctionnent dans un HashMap, vous devez remplacer hashCode() pour qu'il renvoie la même valeur dans les deux cas, et equals() retourne true lorsque les comparer.

Si l'identité de l'objet est basée sur la valeur de chaîne, alors

@Override
public int hashCode()
{
    return theStringValue.hashCode();
}

et

@Override
public boolean equals(Object o)
{
    return this.theStringValue.equals(o);
}

devrait marcher

30
Jim Garrison

Lorsqu'une classe ne remplace pas les méthodes equals() ou hashCode(), les implémentations par défaut trouvées sur la classe Object sont utilisées à la place. En particulier, equals() vérifie simplement l'égalité de référence.

Cela explique immédiatement pourquoi votre approche ne fonctionne pas: le nouvel objet Key ne fait clairement pas référence à l'ancien objet Key.

Si vous souhaitez pouvoir spécifier une nouvelle instance avec la même propriété, vous devez remplacer la méthode equals() par une implémentation qui répond à vos critères d'égalité de clé. Vous devez également remplacer hashCode() pour avoir un contrôle total sur le processus de comparaison de clés.

6
dlev