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/add
elemento 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
List
está lleno de nulos. Con Guava podemos hacerInts.asList(new int[10])
lo que inicializará nuestra lista con0
s. Sin embargo, patrón limpio, gracias por el ejemplo.ArrayList
es una implementación de laList
interfaz yArrays.asList
devuelve unArrayList
. Te sugiero que busques polimorfismo.UnsupportedOperationException
si 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
ArrayList
no es lo mismo que su tamaño . El tamaño es igual al número de elementos contenidos enArrayList
(y cualquier otraList
implementació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, seindex
relaciona con el número real de los elementos de la lista (= tamaño) (que es cero en su código, por lo tanto,AIOOBE
se arroja), no con la longitud de la matriz (= capacidad) (que es un detalle de implementación específico a laArrayList
).El
set
método es común a todas lasList
implementaciones, 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
Stream
API 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
size
es elList
tamaño deseado y sin la desventaja mencionada aquí , todos los elementos en elList
se inicializan como0
.(Hice una búsqueda rápida y no vi
stream
ninguna 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
ArrayList
puede intentar eso:Si ya ha declarado una variable de tamaño de matriz, usaría la variable en
size
lugar 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