93 votes

Utilise java Map.containsKey () redondant avec map.get ()

J'ai été me demandais depuis quelques temps il est autorisé dans les meilleures pratiques de s'abstenir de l'utilisation de l' containsKey() méthode java.util.Map et au lieu de faire un nul vérifier sur le résultat de l' get().

Mon raisonnement est qu'il semble inutile de faire la recherche de la valeur à deux reprises, d'abord à l' containsKey() , puis de nouveau pour get().

D'autre part, il se peut que la plupart des implémentations de Map cache de la dernière recherche ou que le compilateur peut sinon faire disparaître la redondance, et que pour des raisons de lisibilité du code, il est préférable de maintenir l' containsKey() partie.

J'aimerais beaucoup avoir vos commentaires.

113voto

Evgeniy Dorofeev Points 52031

Certaines implémentations sont autorisés à avoir des valeurs nulles, par exemple table de hachage, dans ce cas, si get(key) retours null il ne garantit pas qu'il n'y a pas d'entrée dans la carte associée à cette clé.

Donc, si vous voulez savoir si une carte contient une touche d' Map.containsKey. Si vous avez simplement besoin d'un associé à une touche d'utiliser Map.get(key). Map.containsKey sera inutile et affectera les performances. En outre, en cas d'accès concurrent à une carte (par exemple ConcurrentHashMap), après avoir testé Map.containsKey(key) il y a de chance que l'entrée sera supprimé par un autre thread avant que vous appelez Map.get(key).

44voto

assylias Points 102015

Je pense que c'est assez standard d'écrire:

 Object value = map.get(key);
if (value != null) {
    //do something with value
}
 

au lieu de

 if (map.containsKey(key)) {
    Object value = map.get(key);
    //do something with value
}
 

Ce n'est pas moins lisible et légèrement plus efficace, je ne vois donc aucune raison de ne pas le faire. Évidemment, si votre carte peut contenir la valeur null, les deux options n'ont pas la même sémantique .

8voto

Brandon Points 3856

Comme assylias indiqué, c'est une question de sémantique. Généralement, La Carte.get(x) == null est ce que vous voulez, mais il y a des cas où il est important d'utiliser containsKey.

Tel est le cas d'un cache. Une fois, j'ai travaillé sur un problème de performances dans une application web qui a été d'interroger sa base de données régulièrement à la recherche pour les entités qui n'existent pas. Lorsque j'ai étudié la mise en cache de code de ce composant, j'ai réalisé que c'était l'interrogation de la base de données si la mémoire cache.get(clé) == null. Si la base de données retourné null (entité qui n'est pas trouvé), nous cache la clé -> null cartographie.

Commutation de containsKey résolu le problème, car une cartographie à une valeur nulle signifie en fait quelque chose. Le mappage des touches null avait une autre signification sémantique que la clé n'existe pas.

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