Y a-t-il une limite au nombre d'éléments qu'un tableau Java peut contenir? Si oui, qu'est-ce que c'est?
Réponses
Trop de publicités?Je n'ai pas vu la bonne réponse, même si c'est très facile à tester.
Dans une machine virtuelle HotSpot récente, la réponse correcte est Integer.MAX_VALUE - 5
. Une fois que vous allez au-delà de cela:
public class Foo {
public static void main(String[] args) {
Object[] array = new Object[Integer.MAX_VALUE - 4];
}
}
Vous obtenez:
Exception in thread "main" java.lang.OutOfMemoryError:
Requested array size exceeds VM limit
Certaines machines virtuelles réservent des mots d’en-tête dans un tableau. Le nombre maximum "sûr" serait 2 147 483 639 ( Integer.MAX_VALUE - 8
). Les tentatives d'allocation de tableaux plus volumineux peuvent provoquer java.lang.OutOfMemoryError.
Si vous avez le code source pour les classes java, checkout java.util.ArrayList
.class (ligne 190):
/**
* The maximum size of array to allocate.
* Some VMs reserve some header words in an array.
* Attempts to allocate larger arrays may result in
* OutOfMemoryError: Requested array size exceeds VM limit
*/
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
Il y a en fait deux limites. Un, l'élément maximal indexable pour le tableau et, deux, la quantité de mémoire disponible pour votre application. Selon la quantité de mémoire disponible et la quantité utilisée par les autres structures de données, vous pouvez atteindre la limite de mémoire avant d'atteindre l'élément de tableau adressable maximal.
En passant par cet article
http://en.wikipedia.org/wiki/Criticism_of_Java#Large_arrays
Java a été critiqués pour ne pas soutenir des tableaux de plus de 2^31-1 (environ 2,1 milliards de dollars) éléments. C'est une limitation de la langue; la Java Langage de Spécification, à la Section 10.4, stipule que:
Les tableaux doivent être indexés par les valeurs int... Une tentative d'accès à un tableau composant avec une longue indice de valeur se traduit par une erreur de compilation.
L'appui de grands tableaux serait également nécessiter des changements à la JVM. Cette limitation se manifeste dans des domaines tels que les collections étant limité à 2 milliards de dollars des éléments et de l'impossibilité de carte mémoire les fichiers de plus de 2 GO. Java manque aussi de véritables tableaux multidimensionnels (de manière contiguë alloué de simples blocs de mémoire accessible par une simple indirection), ce qui limite la performance scientifique et technique de l'informatique.