Limite théorique pour le nombre de touches (objets) qui peut être stockée dans une table de hachage?
Est-il une limite théorique pour le nombre d'entrées de clé qui peut être stockée dans une table de hachage ou est-il purement dépendent du segment de mémoire disponible?
Qui le structure de données est le meilleur de stocker un très grand nombre d'objets (dire plusieurs centaines de milliers d'objets)?
- Avez-vous l'intention de demander sur le nombre de clés uniques, ou le nombre d'entrées? J'aurais juré HashMap a été construit avec des seaux, alors il existe un Entier.MAX_VALUE seaux au plus, chacun d'eux peut avoir une liste avec de nombreux, de nombreuses entrées.
- Question intéressante, obtient mon +1
- Diffierent les gens ont des idées différentes de la grande. Pouvez-vous être plus précis, voulez-vous dire 100s, 1000s, des millions, des millions, des milliards?
- Oui, j'ai spécifié la taille (plusieurs lakhs, voire des millions)
- Question préférée avoir mon +1
- Veuillez consulter la réponse du fil: stackoverflow.com/questions/19886017/...
Vous devez vous connecter pour publier un commentaire.
Regardant la documentation de cette classe, je dirais que la limite théorique est
Integer.MAX_VALUE
(231-1 = 2147483647) éléments.C'est parce qu'à mettre correctement en œuvre de cette classe, le
size()
méthode est tenu de restituer uneint
représentant le nombre de paires clé/valeur.À partir de la documentation de
table de hachage.size()
Remarque: Cette question est très similaire à Le nombre de données d'une liste peut contenir au maximum.
Je dirais que cela dépend de ce que vous avez besoin de stocker et de quel type d'accès dont vous avez besoin. Tous les construit dans, les collections sont probablement bien optimisé pour les grandes quantités.
size()
n'est pas vraiment un problème: Si la carte contient plus deInteger.MAX_VALUE
éléments, renvoieInteger.MAX_VALUE
. - download.oracle.com/javase/6/docs/api/java/util/Map.html#size() Seulement le code client de ne pas reconnaître le vrai sens desize()
devrait être un problème.HashMap.size()
affine cette spécification: download.oracle.com/javase/6/docs/api/java/util/... On peut se demander si, oui ou non c'est probablement un "bug" dans le cahier des charges 🙂HashMap
, il n'a pas vraiment l'air de grok que lesize
champ peut déborder. Spec de la conformité? 🙂 Donc je devrais peut-être ai formulé que "size()
doit pas vraiment être un problème"...size
-débordement, et réviser la documentation poursize()
je dirais qu'il n'y aurait pas une limitation àInteger.MAX_VALUE
...static final int MAXIMUM_CAPACITY = 1 << 30;
Après 2<sup>30 hash map va commencer à se comporter bizarrement, mais il ne permet plus de nombres que le 2<sup>30.HashMap
détient les valeurs dans un tableau, qui peut contenir jusqu'àInteger.MAX_VALUE
. Mais cela ne compte pas les collisions. ChaqueEntry
a unnext
champ, qui est également une porte d'entrée. C'est comment les collisions (deux ou plusieurs objets avec le même hashcode) sont résolus. Donc, je ne dirais pas qu'il n'y a aucune limite (en dehors de la mémoire disponible)Notez que si vous dépassez
Integer.MAX_VALUE
, vous aurez un comportement inattendu de certaines méthodes, comme lasize()
, maisget()
etput()
fonctionne toujours. Et ils vont travailler, parce que lehashCode()
de n'importe quel objet sera de retour uneint
, donc, par définition, chaque objet dans la carte. Et puis chaque objet va entrer en collision avec un autre déjà existant.hashCode()
retourneint
. Ainsi, après la table est pleine, il n'y aura que des collisions.Il n'y a pas de limite théorique, mais il y a une limite de compartiments pour stocker les différents entrée chaînes (stockées dans un autre hashkey). Une fois que vous atteignez cette limite, chaque nouvel ajout entraînera un hash collision-mais ce n'est pas un problème, sauf pour la performance...
Je suis d'accord avec @Bozho et aussi à ajouter que vous devriez lire les Javadoc sur la table de hachage avec soin. Notez comment il traite de la capacité initiale et le facteur de charge et la manière dont elles affectent les performances de la table de hachage.
HashMap est parfait pour la tenue de grands ensembles de données (tant que vous ne lancez pas de touches ou de la mémoire), mais la performance peut être un problème.
Vous pouvez avoir besoin de regarder dans distribuées caches/grilles de données si vous trouvez que vous ne pouvez pas manipuler les ensembles de données dont vous avez besoin dans un seul Java/JVM programme.