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())
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.