que index java list indexoutofboundsexception

index - Insertar en cualquier posición en java.util.List



indexoutofboundsexception index 1 size 1 (6)

ArrayList tiene dos miembros: capacidad y tamaño

capacidad es la longitud de la matriz subyacente, tamaño es la longitud de la matriz que representa ArrayList

por lo que tiene que agregar datos en la lista, para que el ArrayList gane el tamaño en el que desea insertar datos

De acuerdo con los documentos, puede insertar objetos en cualquier posición en una lista:

El usuario de esta interfaz tiene un control preciso sobre dónde se inserta cada elemento en la lista.

(fuente: http://download.oracle.com/javase/6/docs/api/java/util/List.html )

Pero el siguiente programa falla con una excepción IndexOutOfBoundsException:

import java.util.ArrayList; public class Test { public static void main(String[] args) { ArrayList<String> myList = new ArrayList<String>(); myList.add(0, "derp"); myList.add(2, "herp"); for (String s : myList) { System.out.println("Le string: " + s); } } }

Tampoco ayuda a establecer explícitamente la capacidad inicial (lo que tiene sentido ya que el valor predeterminado es 10).

¿Por qué no puedo insertar objetos en cualquier posición siempre que su índice sea inferior a la capacidad? ¿Es el tamaño siempre igual al número de elementos insertados?


El tamaño de la lista es siempre igual al número de los elementos insertados

Throws: IndexOutOfBoundsException - if the index is out of range (index < 0 || index > size())

javadoc


La capacidad de la lista no es la misma que su tamaño.

La capacidad es una propiedad de las listas de arreglos de matriz (como ArrayList o Vector ), y es el tamaño asignado de la matriz de respaldo (es decir, el número máximo de elementos que podría colocar antes de necesitar aumentar la estructura).

El tamaño, como usted dice, es el número de elementos presentes en la lista.

Entonces, ¿por qué no podría insertar un elemento donde quiera, siempre que haya espacio para él? Simple, porque la interfaz de la List no especifica cómo se realiza la copia de seguridad del objeto, y no se pudo hacer en algo como una lista LinkedList ; así que el comportamiento homogéneo (y correcto) es lanzar una excepción cuando eso sucede.

Así que tienes dos opciones:

  • Inicialice la lista correctamente agregando valores predeterminados hasta el tamaño deseado.
  • Si null es un valor predeterminado razonable para usted, puede usar una matriz directamente.

Primero se myList.add(0, "herp") y luego verificará el tamaño. Entonces, el tamaño es 1 pero está insertando en la posición 2 .


Puede insertar un objeto en cualquier posición válida . Eche un vistazo de cerca al Javadoc para add(int, E) :

Tiros
IndexOutOfBoundsException: si el índice está fuera de rango (index < 0 || index > size())

En otras palabras, insertar un elemento siempre aumenta el tamaño de la lista en 1. Puede insertar en cualquier extremo o en el medio ... pero no puede insertar más allá del final.

La capacidad de un ArrayList es efectivamente un detalle de implementación: controla cuando la matriz de respaldo necesita ser reemplazada por una más grande para hacer frente a más elementos. El tamaño de una lista es la parte importante aquí: una lista con capacidad 100 pero el tamaño 5 sigue siendo solo una lista de 5 elementos, por lo que la inserción en la posición 67 en esa lista no tendría sentido.


myList.add (2, "herp") debe ser myList.add (1, "herp")

A medida que aumenta el tamaño de la lista es de 1, no de 2.