web-dev-qa-db-fra.com

Comment initialiser une ArrayList avec tous les zéros en Java?

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++?

144
Frost

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());
391
aioobe
// 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);
11
corsiKa

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);
}
8
WhiteFang34

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 N
  • boxed() - chaque élément encadré par un entier
  • collect(Collectors.toList()) - collecte des éléments de flux
3
am0wa

Ce 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.

1
Marcin