web-dev-qa-db-fra.com

Quelle est la valeur maximale de l'index d'une arrayliste?

J'y pensais. Vous pouvez avoir accès à une mémoire sans fin (un ordinateur avec beaucoup de RAM) afin de pouvoir continuer à ajouter de plus en plus d'éléments à votre arraylist.

Mais, je pense que vous ne pouvez accéder que des éléments par index jusqu'à une certaine valeur de l'index. La taille maximale de cet indice pourrait être = nombre maximum que votre ordinateur peut représenter, soit long 9 223,372 036 854 775 807 en Java.

Je sais que vous pouvez accéder à l'élément suivant à l'aide d'un itérateur. Mais comment accéder aux éléments d'accès après le (9,223,372,036 854 775 807) ème index, à l'aide d'un numéro d'index?

5
Jedi Knight

ArrayList in Java a une méthode get (int index) méthode. int est une valeur 32 bits signée, avec une valeur maximale de 2 147 483 647. C'est la plus grande valeur possible qui peut être accessible dans une période ArrayList. Période. Les spécificités de la taille maximale du array ou ArrayList diffèrent en fonction du Mise en œuvre de la JVM (qui peut être inférieure à la MAX_INT valeur). Vous ne pouvez pas faire un ArrayList (ou pour cela un int[] Array) qui a un long pour son index.

Si vous essayiez d'instancier une liste de marécages de cette magnitude, vous auriez une structure d'au moins 8 gigaoctets - ce seul représente uniquement les pointeurs Max_int, et non l'espace supplémentaire des données à chaque point.

Tenter d'accéder au-delà de la valeur maximale autorisée via un itérateur associé à la matrice entraînerait probablement l'un des OutOfMemoryException, IndexOutOfBoundsException ou a NoSuchElementException selon la mise en œuvre.

C'est une utilisation très peu pratique de la mémoire. Si l'on voulait vouloir une telle structure de données, il faut étudier moins RAM approches intensives telles que les bases de données, les tableaux de rattrapage, etc.

16
user40980

Pour les tableaux normaux, si vous utilisez le stock Oracle JVM, il semble que la réponse réelle est MAX_INT-5 ou MAX_INT-2 Selon la version.

Pour ArrayList la réponse semble être MAX_INT-8 . (Ligne 191, car le code source n'a apparemment pas d'ancrages à lier!)

7
Steven Schlansker