Il semble arraylist
ne pas faire son travail pour le pré-dimensionnement:
// presizing
ArrayList<Integer> list = new ArrayList<Integer>(60);
Ensuite, lorsque j'essaye d'y accéder:
list.get(5)
Au lieu de renvoyer 0, il lève IndexOutOfBoundsException: Index 5 hors limites pour la longueur 0 .
Existe-t-il un moyen d'initialiser tous les éléments à 0 d'une taille exacte comme ce que fait C ++?
java
collections
Gel
la source
la source
Réponses:
L'entier passé au constructeur représente sa capacité initiale , c'est-à-dire le nombre d'éléments qu'il peut contenir avant de devoir redimensionner son tableau interne (et n'a rien à voir avec le nombre initial d'éléments dans la liste).
Pour initialiser une liste avec 60 zéros, procédez comme suit:
Si vous souhaitez créer une liste avec 60 objets différents , vous pouvez utiliser l'API Stream avec un
Supplier
comme suit:la source
ArrayList
sur ce bien, et au lieu simplement programmeList
. C'est une décision laissée au PO, bien sûr.nCopies
est immuable, donc créer un nouveauArrayList
est probablement une bonne idée.nCopies
avec un objet complexe, la collection n'est pas instanciée avec 60 objets différents, mais 60 fois avec le même objet. Alors n'utilisez ceci que pour les primitives.nCopies
est utile avec des types de référence: des objets immuables tels que des chaînes, des modèles d'objet nul, des constantes d'énumération, ... Quoi qu'il en soit, j'ai mis à jour la réponse avec une solution pour créer 60 objets différents.la source
IndexOutOfBoundsException
avecList<Integer> list = new ArrayList<Integer>(60); Collections.fill(list, new Integer(0)); list.get(5);
Arrays.asList
produit unList
qui ne permet pas d'ajouter ou de supprimer, donc ce n'est pas tout à fait la même chose que ce que veut l'OP. Cela fonctionnerait si tout ce que vous avez à faire estset
, mais vous feriez peut-être mieux d'utiliser simplement un tableau dans ce cas.Le 60 que vous dépassez n'est que la capacité initiale de stockage interne. C'est un indice sur la taille que vous pensez que cela pourrait être, mais bien sûr, ce n'est pas limité par cela. Si vous avez besoin de prérégler des valeurs, vous devrez les définir vous-même, par exemple:
la source
Implémentation Java 8 (Liste initialisée avec des
60
zéros) :new int[N]
- crée un tableau rempli de zéros et de longueur Nboxed()
- chaque élément encadré à un entiercollect(Collectors.toList())
- recueille des éléments de fluxla source
Ce n'est pas comme ça. ArrayList utilise simplement un tableau comme respentation interne. Si vous ajoutez plus de 60 éléments, le tableau sous-jacent sera agrandi. Cependant, vous pouvez ajouter autant d'éléments à ce tableau que de RAM dont vous disposez.
la source