Java HashMap.containsKey() ne fait pas appel equals()
J'ai une table de hachage:
Map<LotWaferBean, File> hm = new HashMap<LotWaferBean, File>();
LotWaferBean lw = new LotWaferBean();
... //populate lw
if (!hm.containsKey((LotWaferBean) lw)) {
hm.put(lw, triggerFiles[l]);
}
Le code pour LotWaferBean
:
@Override
public boolean equals(Object o) {
if (!(o instanceof LotWaferBean)) {
return false;
}
if (((LotWaferBean) o).getLotId().equals(lotId)
&& ((LotWaferBean) o).getWaferNo() == waferNo) {
return true;
}
return false;
}
Dans mon IDE j'ai mis des points d'arrêt dans equals()
mais il n'est jamais exécutée. Pourquoi?
Vous devez vous connecter pour publier un commentaire.
Essayez de mettre un point d'arrêt dans hashCode().
Si le hashCode() de deux objets dans un plan de retour le même nombre, alors égal sera appelé à déterminer si ils sont vraiment égaux.
equals
méthode, vous devez mettre en œuvre lahashcode
un... comme c'est écrit dans le manuel 🙂Seulement si 2 hashCodes égalité,
equals()
seront appelés lors de la boucle de touches.JVM vérifie le hashcode seau de cet objet hashcode, si il y a plus d'objets avec le même hashcode, alors seulement, la méthode equals() sera exécutée. Et, le développeur doit respecter le contrat entre le hashCode() et equals() méthodes.
c'est la bonne réponse... ou presque. Précisément, si 2 des codes de hachage entrent en collision (étant le même assure qu'ils sont liés à entrer en collision avec un hashmap impl), alors seulement l'égalité vérification est effectuée.
BTW, votre égal méthode est probablement incorrect. En cas
LotWaferBean
est substituée, votreequals
méthode accepte le sous-classe de l'instance, mais votre sous-classe aussi faire?- Il mieux lire:
Comme Abimaran Kugathasan noté, la table de hachage de la mise en œuvre de hachage utilise-seaux efficacement chercher les clés, et utilise uniquement equals() pour comparer les clés de la correspondance de hachage-seau à l'encontre de la clé donnée. Il est intéressant de noter que les touches sont affectées à de hachage seaux lorsqu'ils sont ajoutés à une table de hachage. Si vous modifiez les clés dans une table de hachage après l'ajout d'une manière qui allait changer leur code de hachage, alors ils ne seront pas dans le bon hash-seau; et d'essayer d'utiliser une clé correspondante pour accéder à la carte, trouver le bon hash-seau, mais il ne contient pas la modification de la clé.
Cela peut entraîner dans certains assez étrange comportement. Vous pouvez définir un point d'arrêt juste avant theMap.containsKey(theKey), et de voir que la valeur de theKey correspond à une clé dans theMap, et pourtant, la clé est égale à() ne sera pas appelé, et containsKey() retournera false.
Comme indiqué ici https://stackoverflow.com/a/21601013 , il y a effectivement un avertissement de la JavaDoc de la Carte quant à l'utilisation de mutable types de clés. Non hachage types de Carte n'aurez pas ce problème particulier, mais pourrait avoir d'autres problèmes lorsque les clés sont modifiés en place.