La vérification de l'existence de clés dans HashMap est-elle toujours nécessaire?
J'ai un HashMap avec disons 1000 entrées et je cherche à améliorer l'efficacité. Si le HashMap est utilisé très fréquemment, la vérification de l'existence de la clé à chaque accès entraînera une surcharge importante. Au lieu de cela, si la clé n'est pas présente et qu'une exception se produit, je peux intercepter l'exception. (quand je sais que cela arrivera rarement). Cela réduira de moitié les accès au HashMap.
Ce n'est peut-être pas une bonne pratique de programmation, mais cela m'aidera à réduire le nombre d'accès. Ou est-ce que je manque quelque chose ici?
[ Mise à jour ] Je n'ai pas de valeurs nulles dans le HashMap.
Réponses:
Avez-vous déjà enregistré une valeur nulle? Sinon, vous pouvez simplement faire:
Sinon, vous pouvez simplement vérifier l'existence si vous obtenez une valeur nulle retournée:
la source
get
va bien et évite de faire deux recherches lorsque vous en avez également besoin.if(value!=null || map.containsKey(key))
pour la deuxième partie. Au moins si vous voulez faire la même chose de toute façon - pas de code répété. Cela fonctionnera en raison d'un court-circuit .Vous ne gagnerez rien en vérifiant que la clé existe. C'est le code de
HashMap
:Vérifiez simplement si la valeur de retour de
get()
est différente denull
.Il s'agit du code source HashMap.
Ressources :
Code source de HashMapMauvaisla source
La meilleure façon est d'utiliser la
containsKey
méthode deHashMap
. Demain, quelqu'un ajoutera null à la carte. Vous devez faire la différence entre la présence de clé et la clé a une valeur nulle.la source
null
ensemble.Voulez-vous dire que vous avez du code comme
partout ? Ensuite, vous devez simplement vérifier si
map.get(key)
renvoyé null et c'est tout. Soit dit en passant, HashMap ne lève pas d'exceptions pour les clés manquantes, il renvoie à la place null. Le seul cas où celacontainsKey
est nécessaire est lorsque vous stockez des valeurs nulles, pour faire la distinction entre une valeur nulle et une valeur manquante, mais cela est généralement considéré comme une mauvaise pratique.la source
Utilisez simplement
containsKey()
pour plus de clarté. C'est rapide et maintient le code propre et lisible. L'intérêt deHashMap
s est que la recherche de clé est rapide, assurez-vous simplement que lehashCode()
etequals()
sont correctement implémentés.la source
la source
Vous pouvez également utiliser la
computeIfAbsent()
méthode dans laHashMap
classe.Dans l'exemple suivant,
map
stocke une liste de transactions (entiers) qui sont appliquées à la clé (le nom du compte bancaire). Pour ajouter 2 transactions de100
et200
àchecking_account
vous pouvez écrire:De cette façon, vous n'avez pas à vérifier si la clé
checking_account
existe ou non.computeIfAbsent()
.Vraiment élégant! 👍
la source
J'utilise habituellement l'idiome
Cela signifie que vous n'appuyez sur la carte que deux fois si la clé est manquante
la source
la source
La réponse de Jon Skeet aborde bien les deux scénarios (carte avec
null
valeur et nonnull
valeur) de manière efficace.Concernant les entrées de nombres et le souci d'efficacité, je voudrais ajouter quelque chose.
Une carte avec 1.000 entrées n'est pas une carte énorme.
Ainsi qu'une carte avec 5.000 ou 10.000 entrées.
Map
sont conçus pour permettre une récupération rapide avec de telles dimensions.Maintenant, il suppose que
hashCode()
les clés de carte fournissent une bonne distribution.Si vous pouvez utiliser un
Integer
type de clé as, faites-le.Sa
hashCode()
méthode est très efficace car les collisions ne sont pas possibles pour desint
valeurs uniques :Si pour la clé, vous devez utiliser un autre type intégré comme
String
par exemple qui est souvent utilisé dansMap
, vous pouvez avoir des collisions mais de 1 000 à quelques milliers d'objets dans leMap
, vous devriez en avoir très peu commeString.hashCode()
méthode fournit une bonne distribution.Si vous utilisez un type personnalisé, remplacez
hashCode()
-leequals()
correctement et assurez-hashCode()
vous que l'ensemble fournit une distribution équitable.Vous pouvez vous référer au point 9 de la
Java Effective
réfère.Voici un article qui détaille le chemin.
la source