3
votes

Comment les valeurs de Hash Map sont-elles stockées (au cas où les valeurs seraient des doublons)?

Un HashMap Java enregistre-t-il les valeurs en double comme uniques ou les enregistre-t-il individuellement?

Imaginons que j'ai la valeur de paires clé-valeur suivante:

A -> "a very long string...."
B -> "another very long string...."
C -> "the same very long string from A key.... (but not same string instance)"


1 commentaires

Vous pouvez envisager de créer des instances StringBuilder des chaînes et de les stocker. De cette façon, vous ne stockez que les références.


4 Réponses :


1
votes

Le HashMap Java n'autorise pas les clés en double, mais il autorise les valeurs en double. Cela les enregistrerait donc sous 3 clés et 3 valeurs.

Pour ne pas enregistrer la valeur deux fois, vous devrez la vérifier (par exemple en utilisant la méthode .containsValue () ).


2 commentaires

Je suppose qu'il n'y a pas de méthode contains () déclarée dans Map


Faites votre choix parmi containsKey () et containsValue () .



3
votes

Un HashMap peut contenir des valeurs en double, donc dans votre exemple, il y aurait 3 clés et 3 valeurs dans la Map .

Cependant, si vous êtes préoccupé par les grandes instances étant stockées plusieurs fois en tant que valeurs dans votre Map , vous devez stocker les références à la même instance.

Par exemple:

String val = "a very long String............";
String val2 = "a second long String.........";
map.put(1,val);
map.put(2,val2);
map.put(3,val);

Il n'y a que deux grandes instances de String . La Map contient 3 références à ces String s (deux références à la première String et une référence à la deuxième String code >), mais les références occupent une petite quantité d'espace de stockage.


0 commentaires

2
votes

Il ne garde pas de valeurs, il contient des références à des valeurs, donc le problème se résume à la question "Est-ce que " est une très longue chaîne .... " et " les mêmes très longue chaîne de A key .... " le même objet en mémoire?"

S'ils ne sont pas des constantes à la compilation et sont obtenus / construits à l'exécution, ce sont des objets différents. Interne de chaînes, avec String # intern , peut vous aider ici mais a ses limitations mentionnées par @bratkartoffel.

Qu'est-ce que le stage Java String?
Quand devrions-nous utiliser la méthode interne de String on String littéraux
Pénalité de performance de String.intern ()


1 commentaires

Veuillez ne PAS utiliser intern () sur une très grande chaîne. Cela entraînera rapidement des problèmes car les instances sont enregistrées dans un espace séparé (génération permanente, pas de tas). Cet espace est limité et destiné aux classes, méthodes et trucs JVM internes.



2
votes

Mais cela ne concerne pas HashMap , je veux dire qu'il ne lui est pas spécifique. Avoir une valeur en tant que String implique également deux autres choses différentes - comme l'internement de String ou le fait que les String sont immuables. De plus, un HashMap ne copie pas la valeur (quoi que cela puisse signifier), il ne stocke que les références à d'autres objets - ce que vous faites avec ces objets dépend entièrement de vous. Si vous modifiez un objet en dehors de la HashMap et que vous interrogez ensuite cette Map par rapport à cette clé associée particulière, vous verrez la mise à jour.


0 commentaires