java - objeto - IndexOutOfBoundsException cuando se agrega a ArrayList en el índice
como llenar un arraylist en java (9)
Debe agregar elementos a ArrayList en serie, comenzando desde 0, 1 y así sucesivamente.
Si necesita agregar elementos a una posición específica, puede hacer lo siguiente:
String[] strings = new String[5];
strings[1] = "Elephant";
List<String> s = Arrays.asList(strings);
System.out.println(s);
Esto producirá la salida de soldadura
[null, Elephant, null, null, null]
Obtengo excepciones Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 1, Size: 0
para el código siguiente. Pero no pude entender por qué.
public class App {
public static void main(String[] args) {
ArrayList<String> s = new ArrayList<>();
//Set index deliberately as 1 (not zero)
s.add(1,"Elephant");
System.out.println(s.size());
}
}
Actualizar
Puedo hacer que funcione, pero trato de entender los conceptos, así que cambié la declaración a continuación, pero tampoco funcionó.
ArrayList<String> s = new ArrayList<>(10)
No agregue el índice como 1 directamente en la lista Si desea agregar valor en la lista, agréguela como esta en s.add ("Elefante"); Por defecto, el tamaño de la lista es 0 Si agrega cualquier elemento en la lista, el tamaño aumentará automáticamente y no podrá agregarlo directamente en el primer índice de la lista. //s.add(0, "Elephant");
Si REALMENTE desea "Elefante" en el índice 1, puede agregar otra entrada (por ejemplo, nula) en el índice 0.
public class App {
public static void main(String[] args) {
ArrayList<String> s = new ArrayList<>();
s.add(null);
s.add("Elephant");
System.out.println(s.size());
}
}
O cambie las llamadas a .add
para especificar null en el índice 0 y elefante en el índice 1.
Tu ArrayList
está vacía. Con esta línea:
s.add(1,"Elephant");
Está intentando agregar "Elephant"
en el índice 1
de ArrayList
(segunda posición), que no existe, por lo que arroja una IndexOutOfBoundsException
.
Utilizar
s.add("Elephant");
en lugar.
add(int index, E element)
API dice: Su lista de matriz tiene un tamaño cero y está agregando un elemento al 1er. índice
Lanza:
IndexOutOfBoundsException - if the index is out of range (index < 0 || index > size())
Use boolean add(E e)
lugar.
ACTUALIZACIÓN basada en la actualización de la pregunta
Puedo hacer que funcione, pero trato de entender los conceptos, así que cambié la declaración a continuación, pero tampoco funcionó.
ArrayList<String> s = new ArrayList<>(10)
Cuando llama a new ArrayList<Integer>(10)
, está configurando la capacidad inicial de la lista en 10, no su tamaño. En otras palabras, cuando se construye de esta manera, la lista de arreglos comienza su vida vacía.
ArrayList no es autoexpandible. Para agregar un artículo en el índice 1, debe tener el elemento # 0.
class App {
public static void main(String[] args) {
ArrayList<String> s = new ArrayList<String>();
//Set index deliberately as 1 (not zero)
s.add(0,"Elephant");
System.out.println(s.size());
}
}
Para Android:
Si necesita utilizar una lista que tendrá muchas lagunas, es mejor usar SparseArray
en términos de memoria (una ArrayList
tendría muchas entradas null
).
Ejemplo de uso:
SparseArray<String> list = new SparseArray<>();
list.put(99, "string1");
list.put(23, "string2");
list.put(45, "string3");
- Use
list.append()
si agrega claves secuenciales, como 1, 2, 3, 5, 7, 11, 13 ... - Use
list.put()
si agrega claves no secuenciales, como 100, 23, 45, 277, 42 ...
Si su lista va a tener más de cientos de elementos, es mejor utilizar HashMap
, ya que las búsquedas requieren una búsqueda binaria y las agrega y quita requieren la inserción y eliminación de entradas en la matriz.
El índice ArrayList comienza desde 0 (cero)
El tamaño de la lista de matriz es 0 y está agregando elemento de cadena en el 1er índice. Sin agregar elemento en el 0 ° índice, no puede agregar las siguientes posiciones de índice. Cuál está mal.
Entonces, simplemente hazlo como
s.add("Elephant");
O tu puedes
s.add(0,"Elephant");