¿Cómo puedo inicializar una ArrayList con todos los ceros en Java?

161

Parece que arraylistno está haciendo su trabajo para presize:

// presizing 

ArrayList<Integer> list = new ArrayList<Integer>(60);

Luego, cuando intento acceder a él:

list.get(5) 

En lugar de devolver 0, arroja IndexOutOfBoundsException: Índice 5 fuera de límites para la longitud 0 .

¿Hay alguna manera de inicializar todos los elementos a 0 de un tamaño exacto como lo que hace C ++?

escarcha
fuente
44
El Javadoc de ese constructor especifica que crea una "lista vacía". Está haciendo su trabajo.
ColinD

Respuestas:

429

El número entero pasado al constructor representa su capacidad inicial , es decir, el número de elementos que puede contener antes de que necesite cambiar el tamaño de su matriz interna (y no tiene nada que ver con el número inicial de elementos en la lista).

Para inicializar una lista con 60 ceros, debe hacer:

List<Integer> list = new ArrayList<Integer>(Collections.nCopies(60, 0));

Si desea crear una lista con 60 objetos diferentes , puede usar Stream API con Supplierlo siguiente:

List<Person> persons = Stream.generate(Person::new)
                             .limit(60)
                             .collect(Collectors.toList());
aioobe
fuente
1
Eso es mucho mejor que mi solución (incluso mi versión actualizada que realmente funciona jejeje). Sin embargo, recomendaría no hacer una nueva ArrayList, y simplemente programarlo List. Esa es una decisión que le queda al OP, por supuesto.
corsiKa
66
La lista devuelta por nCopieses inmutable, por lo que crear una nueva ArrayListes probablemente una buena idea.
aioobe
44
Tenga en cuenta que cuando se usa nCopiescon un objeto complejo, la colección no se instancia con 60 objetos diferentes, sino 60 veces con el mismo objeto. Así que solo usa esto para las primitivas.
membersound
1
@membersound, puedo pensar en muchos escenarios donde nCopieses útil con tipos de referencia: objetos inmutables como cadenas, patrones de objetos nulos, constantes de enumeración, ... De todos modos, actualicé la respuesta con una solución para crear 60 objetos diferentes.
aioobe
@aioobe Sé que hay muchos escenarios en los que las copias son útiles. Solo quería agregar esto, ya que probé copias con objetos mutables y me sorprendió que no funcionara como esperaba. Por si alguien intenta la misma tarea. ¡Aún así gracias por la actualización!
membersound
12
// 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);
corsiKa
fuente
2
Esto solo llena una lista con entradas existentes. No lo inicializará con elementos como se desee.
WhiteFang34
Esto no llenará la lista con 60 ceros.
aioobe
Incluso si lo hiciera, crearía 60 objetos donde no tiene que crear ninguno.
ColinD
1
@Frost: obtendrá un IndexOutOfBoundsExceptionconList<Integer> list = new ArrayList<Integer>(60); Collections.fill(list, new Integer(0)); list.get(5);
WhiteFang34
2
Arrays.asListproduce un Listque no permite agregar o quitar, por lo que no es lo mismo que lo que quiere el OP. Funcionaría si todo lo que necesita hacer es set, pero podría ser mejor que solo use una matriz en ese caso.
ColinD
8

Los 60 que está pasando son solo la capacidad inicial de almacenamiento interno. Es una pista de lo grande que crees que podría ser, pero, por supuesto, no está limitado por eso. Si necesita preestablecer valores, deberá establecerlos usted mismo, por ejemplo:

for (int i = 0; i < 60; i++) {
    list.add(0);
}
WhiteFang34
fuente
4

Implementación de Java 8 (Lista inicializada con 60ceros) :

List<Integer> list = IntStream.of(new int[60])
                    .boxed()
                    .collect(Collectors.toList());
  • new int[N] - crea una matriz llena de ceros y longitud N
  • boxed() - cada elemento encuadrado en un entero
  • collect(Collectors.toList()) - recoge elementos de secuencia
am0wa
fuente
0

No es así. ArrayList solo usa array como respeto interno. Si agrega más de 60 elementos, la matriz subyacente se ampliará. Sin embargo, puede agregar tantos elementos a esta matriz como la RAM que tiene.

Marcin
fuente