Si je passe plusieurs fois la même clé à HashMap
la put
méthode de, que se passe-t-il avec la valeur d'origine? Et si même la valeur se répète? Je n'ai trouvé aucune documentation à ce sujet.
Cas 1: valeurs écrasées pour une clé
Map mymap = new HashMap();
mymap.put("1","one");
mymap.put("1","not one");
mymap.put("1","surely not one");
System.out.println(mymap.get("1"));
Nous obtenons surely not one
.
Cas 2: valeur en double
Map mymap = new HashMap();
mymap.put("1","one");
mymap.put("1","not one");
mymap.put("1","surely not one");
// The following line was added:
mymap.put("1","one");
System.out.println(mymap.get("1"));
Nous obtenons one
.
Mais qu'advient-il des autres valeurs? J'enseignais les bases à un étudiant et on m'a posé cette question. Est-ce Map
comme un compartiment où la dernière valeur est référencée (mais en mémoire)?
Réponses:
Par définition, la
put
commande remplace la valeur précédente associée à la clé donnée dans la carte (conceptuellement comme une opération d'indexation de tableau pour les types primitifs).La carte laisse simplement tomber sa référence à la valeur. Si rien d'autre ne contient une référence à l'objet, cet objet devient éligible pour le garbage collection. De plus, Java renvoie toute valeur précédente associée à la clé donnée (ou
null
s'il n'y en a aucune), afin que vous puissiez déterminer ce qui s'y trouvait et conserver une référence si nécessaire.Plus d'informations ici: HashMap Doc
la source
Vous pouvez trouver votre réponse dans le javadoc de Map # put (K, V) (qui retourne en fait quelque chose):
Donc, si vous n'affectez pas la valeur retournée lors de l'appel
mymap.put("1", "a string")
, elle devient simplement non référencée et donc éligible pour le garbage collection.la source
null
) comme documenté juste au-dessus dans le javadoc donc, oui, c'est ce que je veux dire. Peut-il vraiment être mal interprété?La valeur précédente de la clé est supprimée et remplacée par la nouvelle.
Si vous souhaitez conserver toutes les valeurs fournies par une clé, vous pouvez envisager d'implémenter quelque chose comme ceci:
la source
c'est la fonction Clé / Valeur et vous ne pouvez pas avoir de clé en double pour plusieurs valeurs parce que lorsque vous voulez obtenir la valeur réelle dont l'une des valeurs appartient à la clé entrée
dans votre exemple lorsque vous voulez obtenir la valeur de "1", laquelle est il ?!
c'est des raisons d'avoir une clé unique pour chaque valeur mais vous pourriez avoir un truc par la bibliothèque standard java:
et vous pouvez l'utiliser de cette façon:
et le résultat des impressions sont:
la source
Associe la valeur spécifiée à la clé spécifiée dans cette carte. Si la carte contenait précédemment un mappage pour la clé, l'ancienne valeur est remplacée.
la source
Il remplace la valeur existante dans la carte pour la clé respective. Et si aucune clé n'existe avec le même nom, elle crée une clé avec la valeur fournie. par exemple:
Touche OUTPUT = "1", valeur = "deux"
Ainsi, la valeur précédente est remplacée.
la source
Pour votre question si la carte était comme un seau: non.
C'est comme une liste avec des
name=value
paires alors qu'ilname
n'est pas nécessaire que ce soit une chaîne (elle le peut, cependant).Pour obtenir un élément, vous passez votre clé à la méthode get () - qui vous donne en retour l'objet assigné.
Et une carte de hachage signifie que si vous essayez de récupérer votre objet à l'aide de la méthode get, elle ne comparera pas le véritable objet à celui que vous avez fourni, car il lui faudrait parcourir sa liste et comparer () la clé vous avez fourni avec l'élément courant.
Ce serait inefficace. Au lieu de cela, peu importe la composition de votre objet, il calcule un soi-disant code de hachage à partir des deux objets et les compare. Il est plus facile de comparer deux
int
s au lieu de deux objets entiers (peut-être profondément complexes). Vous pouvez imaginer le hashcode comme un résumé ayant une longueur prédéfinie (int), il n'est donc pas unique et a des collisions. Vous trouverez les règles du hashcode dans la documentation à laquelle j'ai inséré le lien.Si vous voulez en savoir plus à ce sujet, vous voudrez peut-être consulter les articles sur javapractices.com et technofundo.com
Cordialement
la source
J'ai toujours utilisé:
si je voulais appliquer plusieurs choses à une seule clé d'identification.
vous pourriez toujours faire quelque chose comme ça et vous créer un labyrinthe!
la source
Les cartes de JDK ne sont pas destinées à stocker des données sous des clés dupliquées.
Au mieux, la nouvelle valeur remplacera les précédentes.
Le pire scénario est une exception (par exemple, lorsque vous essayez de le collecter en tant que flux):
Pas de doublons:
Stream.of("one").collect(Collectors.toMap(x -> x, x -> x))
Flux dupliqué:
Stream.of("one", "not one", "surely not one").collect(Collectors.toMap(x -> 1, x -> x))
Pour gérer les clés dupliquées - utilisez un autre package, par exemple: https://google.github.io/guava/releases/19.0/api/docs/com/google/common/collect/Multimap.html
Il existe de nombreuses autres implémentations traitant des clés dupliquées. Celles-ci sont nécessaires pour le Web (par exemple, les clés de cookie dupliquées, les en-têtes Http peuvent avoir les mêmes champs, ...)
Bonne chance! :)
la source
Collectors.toMap()
a le troisième argument - fonction de fusion. Si nous voulons remplacer tout simplement le dernier élément en double:Stream.of("one", "two", "one").collect(Collectors.toMap(x -> x, x -> x, (key1, key2) -> key2))
. lien"one", "not one", "surely not one"
ne produira aucune erreur de clé en double à cause de toutes les chaînes différentes.BTW, si vous voulez une sémantique telle que mettre seulement si cette clé n'existe pas. vous pouvez utiliser
concurrentHashMap
avecputIfAbsent()
fonction. Regarde ça:https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ConcurrentHashMap.html#put(K,%20V)
concurrentHashMap
est thread-safe avec de hautes performances car il utilise un mécanisme de " verrouillage des bandes " pour améliorer le débit.la source
Oui, cela signifie que toutes les 1 clés avec valeur sont écrasées avec la dernière valeur ajoutée et ici vous ajoutez "sûrement pas une" donc elle n'affichera que "sûrement pas une".
Même si vous essayez d'afficher avec une boucle, il n'affichera également qu'une seule clé et valeur qui ont la même clé.
la source
Signifie que la carte de hachage n'autorisera pas les doublons, si vous avez correctement remplacé les méthodes égales et hashCode ().
HashSet utilise également HashMap en interne, voir la doc source
la source