Il semble que arraylist
ne fasse pas son travail pour presizing:
// presizing
ArrayList<Integer>() list = new ArrayList<Integer>(60);
Ensuite, lorsque j'essaie d'y accéder:
list.get(5)
Il affiche null au lieu de 0. Existe-t-il un moyen d'initialiser tous les éléments à 0 d'une taille exacte comme le fait le C++?
L'entier passé au constructeur représente son 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 de la liste ).
Pour initialiser une liste avec 60 zéros, vous devez:
List<Integer> list = new ArrayList<Integer>(Collections.nCopies(60, 0));
Si vous souhaitez créer une liste avec 60 objets différents , vous pouvez utiliser l'API Stream avec un Supplier
comme suit:
List<Person> persons = Stream.generate(Person::new)
.limit(60)
.collect(Collectors.toList());
// apparently this is broken. Whoops for me!
Java.util.Collections.fill(list,new Integer(0));
// this is better
Integer[] data = new Integer[60];
Arrays.fill(data,new Integer(0));
List<Integer> list = Arrays.asList(data);
Les 60 que vous passez ne représentent que la capacité initiale de stockage interne. C'est un indice de la taille que vous croyez, mais ce n'est évidemment pas limité par cela. Si vous devez prédéfinir des valeurs, vous devrez les définir vous-même, par exemple:
for (int i = 0; i < 60; i++) {
list.add(0);
}
Implémentation Java 8 (Liste initialisée avec 60
Zéros):
List<Integer> list = IntStream.of(new int[60])
.boxed()
.collect(Collectors.toList());
new int[N]
- crée un tableau rempli de zéros et de longueur Nboxed()
- chaque élément encadré par un entiercollect(Collectors.toList())
- collecte des éléments de fluxCe n'est pas comme ça. ArrayList utilise simplement un tableau comme mémoire interne. Si vous ajoutez plus de 60 éléments, le tableau sous-jacent sera remplacé. Cependant, vous pouvez ajouter autant d’éléments à ce tableau que RAM vous avez.