Existe-t-il une limite théorique au nombre d'entrées de clé pouvant être stockées dans un HashMap ou cela dépend-il uniquement de la mémoire de tas disponible?
En outre, quelle structure de données est la meilleure pour stocker un très grand nombre d'objets (disons plusieurs centaines de milliers d'objets)?
Existe-t-il une limite théorique au nombre d'entrées de clé pouvant être stockées dans une carte de hachage ou cela dépend-il uniquement de la mémoire de pile disponible?
En regardant la documentation de cette classe , je dirais que la limite théorique est Integer.MAX_VALUE
(231-1 = 2147483647) éléments.
En effet, pour implémenter correctement cette classe, la méthode size()
est obligée de renvoyer une int
représentant le nombre de paires clé/valeur.
D'après la documentation de HashMap.size()
Retourne: le nombre de mappages clé-valeur dans cette carte
Remarque: Cette question est très similaire à Combien de données une liste peut contenir au maximum .
quelle structure de données est la meilleure pour stocker un très grand nombre d'objets (disons plusieurs centaines de milliers d'objets)?
Je dirais que cela dépend de ce que vous devez stocker et du type d'accès dont vous avez besoin. Toutes les collections intégrées sont probablement bien optimisées pour de grandes quantités.
HashMap
contient les valeurs dans un tableau pouvant contenir jusqu'à Integer.MAX_VALUE
. Mais cela ne compte pas les collisions. Chaque Entry
a un champ next
, qui est aussi une entrée. C’est ainsi que sont résolues les collisions (deux objets ou plus avec le même hashcode). Donc, je ne dirais pas qu'il y a une limite (en dehors de la mémoire disponible)
Notez que si vous dépassez Integer.MAX_VALUE
, vous obtiendrez un comportement inattendu de certaines méthodes, telles que size()
, mais get()
et put()
continueront de fonctionner. Et ils fonctionneront, car la hashCode()
de tout objet retournera une int
, donc, par définition, chaque objet tiendra dans la carte. Et puis chaque objet entrera en collision avec un existant.
Je suis d'accord avec @ Bozho et ajouterai aussi que vous devriez lire attentivement le Javadoc sur HashMap. Notez comment il aborde la capacité initiale et le facteur de charge et comment ils affecteront les performances du HashMap.
HashMap convient parfaitement pour la conservation de grands ensembles de données (à condition de ne pas manquer de clés ou de mémoire), mais les performances peuvent poser problème.
Vous devrez peut-être consulter les caches/grilles de données distribués si vous constatez que vous ne pouvez pas manipuler les jeux de données dont vous avez besoin dans un seul programme Java/JVM.
Il n'y a pas de limite théorique, mais il existe une limite de compartiments pour stocker différentes chaînes d'entrée (stockées sous une clé de hachage différente). Une fois que vous atteignez cette limite, chaque nouvelle addition entraîne une collision de hachage - mais ce n'est pas un problème, sauf pour les performances ...