Puede establecer el tamaño inicial de una ArrayList haciendo
ArrayList<Integer> arr=new ArrayList<Integer>(10);
Sin embargo, no puedes hacer
arr.add(5, 10);
porque causa una excepción fuera de límites.
¿De qué sirve establecer un tamaño inicial si no puede acceder al espacio que asignó?
La función de agregar se define add(int index, Object element)así que no estoy agregando al índice 10.

set/addelemento n-1 .ArrayList. Personalmente, me gustaría un método que me permitiera establecer un tamaño tal que pudiera poner las cosas en índices específicos. Este método parece notablemente ausente.Respuestas:
Estás confundiendo el tamaño de la lista de matriz con su capacidad:
Cuando llama
new ArrayList<Integer>(10), está configurando la capacidad inicial de la lista , no su tamaño. En otras palabras, cuando se construye de esta manera, la lista de matriz comienza su vida vacía.Una forma de agregar diez elementos a la lista de la matriz es mediante un bucle:
Una vez hecho esto, ahora puede modificar elementos en los índices 0..9.
fuente
while(arr.size() < 10) arr.add(0);Puede ser útil decir que el tamaño debe ser al menos10. por ejemplo, para que pueda usarloarr.set(9, n);Si desea una lista con un tamaño predefinido, también puede usar:
fuente
Listestá lleno de nulos. Con Guava podemos hacerInts.asList(new int[10])lo que inicializará nuestra lista con0s. Sin embargo, patrón limpio, gracias por el ejemplo.ArrayListes una implementación de laListinterfaz yArrays.asListdevuelve unArrayList. Te sugiero que busques polimorfismo.UnsupportedOperationExceptionsi desea usar Collections.fill (list, obj); para llenar la lista con un objeto repetido, alternativamente, puede usar
la línea copia 10 veces 0 en su ArrayList
fuente
La capacidad de un
ArrayListno es lo mismo que su tamaño . El tamaño es igual al número de elementos contenidos enArrayList(y cualquier otraListimplementación).La capacidad es solo la longitud de la matriz subyacente que se utiliza para almacenar internamente los elementos de la
ArrayList, y siempre es mayor o igual al tamaño de la lista.Al llamar
set(index, element)a la lista, seindexrelaciona con el número real de los elementos de la lista (= tamaño) (que es cero en su código, por lo tanto,AIOOBEse arroja), no con la longitud de la matriz (= capacidad) (que es un detalle de implementación específico a laArrayList).El
setmétodo es común a todas lasListimplementaciones, como por ejemploLinkedList, que no está implementado realmente por una matriz, sino como una cadena vinculada de entradas.Editar : en realidad usas el
add(index, element)método, noset(index, element), pero el principio es el mismo aquí.fuente
Si desea agregar los elementos con índice, en su lugar podría usar una matriz.
fuente
10 es la capacidad inicial de la AL, no el tamaño (que es 0). Debe mencionar la capacidad inicial a un valor alto cuando va a tener muchos elementos, ya que evita la sobrecarga de expandir la capacidad a medida que continúa agregando elementos.
fuente
Supongo que una respuesta exacta a tu pregunta sería:
Establecer un tamaño inicial en una ArrayList reduce el nr. de veces la reasignación de memoria interna tiene que ocurrir. La lista está respaldada por una matriz. Si especifica, es decir, la capacidad inicial 0, ya en la primera inserción de un elemento, la matriz interna debería ser redimensionada. Si tiene una idea aproximada de cuántos elementos contendrá su lista, establecer la capacidad inicial reduciría el nr. de reasignaciones de memoria que suceden mientras usa la lista.
fuente
Esto podría ayudar a alguien
fuente
Llegar tarde a esto, pero después de Java 8 , personalmente considero que este siguiente enfoque con la
StreamAPI es más conciso y puede ser una alternativa a la respuesta aceptada .Por ejemplo,
Arrays.stream(new int[size]).boxed().collect(Collectors.toList())donde
sizees elListtamaño deseado y sin la desventaja mencionada aquí , todos los elementos en elListse inicializan como0.(Hice una búsqueda rápida y no vi
streamninguna respuesta publicada; no dude en informarme si esta respuesta es redundante y puedo eliminarla)fuente
En este momento no hay elementos en su lista, por lo que no puede agregar al índice 5 de la lista cuando no existe. Está confundiendo la capacidad de la lista con su tamaño actual.
Solo llama:
agregar el número entero a su ArrayList
fuente
Aunque su lista de arrays tiene una capacidad de 10, la lista real no tiene elementos aquí. El método add se usa para insertar un elemento en la lista real. Como no tiene elementos, no puede insertar un elemento en el índice de 5.
fuente
Si desea agregar 10 elementos a su
ArrayListpuede intentar eso:Si ya ha declarado una variable de tamaño de matriz, usaría la variable en
sizelugar del número '10'fuente
Me enfrenté a un problema similar, y solo sabiendo que arrayList es una implementación de matriz redimensionable de la interfaz List, también espero que pueda agregar elementos a cualquier punto, pero al menos tenga la opción de definir el tamaño inicial. De todos modos, primero puede crear una matriz y convertirla en una lista como:
o
fuente
ArrayList myList = new ArrayList (10);
/ * Declarar que la capa inicial de arraylist no es más que ahorrar tiempo de cambio internamente; cuando agregamos el elemento internamente, verificamos la capa para aumentar la capa, podría agregar el elemento en el índice 0 inicialmente, luego en 1 y así sucesivamente. * /
fuente
Mis dos centavos en adelante
Stream. Creo que es mejor usarcon la flexibilidad de poner cualquier valor inicial.
fuente