33 votes

IdentityHashMap renvoyant une valeur incorrecte

Si je comprends bien, le code suivant devrait afficher false car il effectue une comparaison basée sur identity .

Cependant, lorsque j'exécute le code suivant, il imprime true :

 public class Test1 {
  public static void main(String[] args) {
    IdentityHashMap m = new IdentityHashMap();
    m.put("A", new String("B"));
    System.out.println(m.remove("A", new String("B")));
  }
}
 

Quelqu'un peut-il m'aider à comprendre ce comportement?

55voto

Pallavi Sonal Points 2101

Vous avez en fait rencontré un bogue dans JDK, voir JDK-8178355 . IdentityHashMap n'a pas d'implémentation personnalisée de la méthode remove(K,V) ajoutée à Map via la méthode par défaut, ce qui est à l'origine de ce problème.

29voto

GhostCat Points 83269

Vous mettre "Un", de nouvelles "B"

Vous retirer "Une", de nouvelles "B"

Donc, oui, votre hypothèse que cette IdentityHashMap devrait pas supprimer cette valeur semble correct.

Mais vous êtes à l'aide de l' remove(key, value) méthode à partir de la base de AbstractMap - qui n'est pas surchargée par la présente sous-classe spécifique!

Ainsi, bien que la javadoc dit:

Cette classe implémente l'interface de la Carte avec une table de hachage, à l'aide de la référence de l'égalité en place de l'objet, de l'égalité lorsque l'on compare les touches (et les valeurs).

L' (et les valeurs) de la partie est (probablement) a mis en place uniquement pour l'insertion des paires clé/valeur.

Donc, l'important, vient de nouveau de la javadoc:

Cette classe n'est pas d'un usage général en application de la feuille! Alors que cette classe implémente l'interface de la Carte, intentionnellement, viole la Carte du contrat général, qui exige l'utilisation de la méthode equals lorsque l'on compare les objets. Cette classe est conçue pour être utilisée uniquement dans les rares cas où la référence de l'égalité sémantique sont nécessaires.

Mon (probablement d'opinions) à emporter: cette classe est une chose très spéciale. Il est très clair et l'étroitesse de but. Et vous avez trouvé un exemple où il tombe en morceaux. (de laquelle je ne trouve pas surprenant: lorsque vous "changement" de la sémantique, mais que vous décidez de réutiliser du code existant, il est presque inévitable de courir dans ce genre d'incohérences).

Il pourrait être considéré comme bug; et que l'autre réponse confirme: c'est un bug!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X