Pregunta

Puede establecer el tamaño inicial para una lista de matrices haciendo

ArrayList<Integer> arr=new ArrayList<Integer>(10);

Sin embargo, no puedes hacer

arr.add(5, 10);

Porque causa una excepción fuera de los límites.

¿De qué sirve establecer un tamaño inicial si no puede acceder al espacio que asignó?

La función Agregar se define como add(int index, Object element) Así que no estoy agregando al índice 10.

¿Fue útil?

Solución

Estás confundiendo el tamaño de la lista de matrices con su capacidad:

  • la Talla es el número de elementos en la lista;
  • la capacidad es cuántos elementos puede acomodar la lista sin reasignar sus estructuras internas.

Cuando usted llama new ArrayList<Integer>(10), está configurando la inicial de la lista capacidad, 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 matriz es usar un bucle:

for (int i = 0; i < 10; i++) {
  arr.add(0);
}

Habiendo hecho esto, ahora puede modificar elementos en los índices 0..9.

Otros consejos

Si desea una lista con un tamaño predefinido, también puede usar:

List<Integer> arr = Arrays.asList(new Integer[10]);

Si desea usar colección.fill (lista, obj); Para llenar la lista con un objeto repetido, alternativamente, puede usar

ArrayList<Integer> arr=new ArrayList<Integer>(Collections.nCopies(10, 0));

La línea copia 10 veces 0 en su ArrayList

Capacidad de una ArrayList no es lo mismo que su Talla. Tamaño es igual al número de elementos contenidos en el ArrayList (y cualquier otro List implementación).

los capacidad es solo la longitud de la matriz subyacente que se utiliza para almacenar internamente los elementos del ArrayList, y siempre es mayor o igual al Talla de la lista.

Al llamar set(index, element) en la lista, el index se relaciona con el número real de los elementos de la lista (= tamaño) (que es cero en su código, por lo tanto, el AIOOBE se arroja), no a la longitud de la matriz (= capacidad) (que es un detalle de implementación específico para el ArrayList).

los set El método es común a todos List implementaciones, como LinkedList, que en realidad no se implementa por una matriz, sino como una cadena de entradas vinculada.

Editar: Realmente usas el add(index, element) método, no set(index, element), pero el principio es el mismo aquí.

Si desea agregar los elementos con índice, podría usar una matriz.

    String [] test = new String[length];
    test[0] = "add";

10 es la capacidad inicial de la AL, no del tamaño (que es 0). Debe mencionar la capacidad inicial de un alto valor cuando va a tener muchos elementos, ya que evita la sobrecarga de expandir la capacidad mientras sigue agregando elementos.

Supongo que una respuesta exacta a tu pregunta sería:

Establecer un tamaño intial en una lista de matrices reduce el NR. de veces tiene que ocurrir la reasignación de memoria interna. La lista está respaldada por una matriz. Si especifica el IE Capacidad inicial 0, ya en la primera inserción de un elemento, la matriz interna tendría que redimensionarse. Si tiene una idea aproximada de cuántos elementos contendría su lista, establecer la capacidad inicial reduciría el NR. de las reashaciones de memoria que ocurren mientras usa la lista.

Esto podría ayudar a alguien -

ArrayList<Integer> integerArrayList = new ArrayList<>(Arrays.asList(new Integer[10]));

Llegar tarde a esto, pero después Java 8, Personalmente encuentro este siguiente enfoque con el Stream API más concisa y puede ser una alternativa a la respuesta aceptada.

Por ejemplo,

Arrays.stream(new int[size]).boxed().collect(Collectors.toList())

dónde size es el deseado List tamaño y sin la desventaja mencionada aquí, todos los elementos en el List se inicializan como 0.

(Hice una búsqueda rápida y no vi stream En cualquier respuesta publicada, no dude en avisarme si esta respuesta es redundante y puedo eliminarla)

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ás confundiendo la capacidad de la lista con su tamaño actual.

Solo llama:

arr.add(10)

Para agregar el entero a su ArrayList

Aunque su ArrayList tiene una capacidad de 10, la lista real no tiene elementos aquí. El método Agregar se usa para insertar un elemento en la lista real. Como no tiene elementos, no puede insertar un elemento en el índice de 5.

Si desea agregar 10 elementos a su ArrayList puedes intentar eso:

for (int i = 0; i < 10; i++)
    arr.add(i);

Si ya ha declarado una variable de tamaño de matriz, usaría la variable size En lugar del número '10'

Me enfrenté al problema similar, y solo saber que ArrayList es una implementación de matriz restitable de la interfaz de la lista, también espero que pueda agregar elemento a cualquier punto, pero al menos tener la opción de definir el tamaño inicial. De todos modos, puede crear una matriz primero y convertirla en una lista como:

  int index = 5;
  int size = 10;

  Integer[] array = new Integer[size];
  array[index] = value;
  ...
  List<Integer> list = Arrays.asList(array);

o

  List<Integer> list = Arrays.asList(new Integer[size]);
  list.set(index, value);

ArrayList myList = new ArrayList (10);

//  myList.add(3, "DDD");
//  myList.add(9, "III");
    myList.add(0, "AAA");
    myList.add(1, "BBB");

    for(String item:myList){
        System.out.println("inside list : "+item);
    }

/*Declarar la capasidad inicial de ArrayList no es más que ahorrar tiempo de cambio en internamente; Cuando agregamos el elemento internamente, verifica la capasidad para aumentar la capasidad, puede agregar el elemento al índice 0 inicialmente que 1 y así sucesivamente. */

Mis dos centavos en Stream. Creo que es mejor usar

IntStream.generate(i -> MyClass.contruct())
         .limit(INT_SIZE)
         .collect(Collectors.toList());

con la flexibilidad de poner cualquier valor inicial.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top