¿Por qué hace este código lanzar un IndexOfOutBoundsException - aka, ¿qué pasa con ensureCapacity()?
Pregunta
Considere los dos siguientes fragmentos de código:
int index = 676;
List<String> strings = new ArrayList<String>();
strings.add(index, "foo");
y
int index = 676;
List<String> strings = new ArrayList<String>();
strings.ensureCapacity(index);
strings.add(index, "foo");
En el primer caso, no me sorprende ver a un IndexOfOutBoundsException. De acuerdo a la API, add(int index, E element)
le tiro un IndexOfOutBoundsException "si el índice está fuera de rango (index < 0 || index > size())
".El tamaño de strings
0 antes de los elementos que se han añadido, por lo que el índice definitivamente va a ser más grande que el ArrayList del tamaño.
Sin embargo, en el segundo caso, yo esperaría que la llamada a la ensureCapacity
para crecer strings
tal que la llamada a add
sería inserte correctamente la cadena "foo"
en el índice 676 - pero no es así.
¿Por qué no?
¿Qué debo hacer para que
add(index, "foo")
obras paraindex > strings.size()
?
Solución
La capacidad de la matriz subyacente en una ArrayList es distinta de los métodos de API List de nivel superior (agregar, eliminar, etc.), y solo habla del tamaño de la matriz de respaldo. Si desea permitir agregar elementos más allá de los límites de la lista, deberá codificarlo usted mismo (o encontrar una colección que lo haga por usted) en una clase de utilidad, poblando nulos, objetos vacíos o lo que su aplicación espere entre los nuevos índice y el tamaño anterior.
Otros consejos
ArrayList.ensureCapacity () no cambia el tamaño real de la lista (que devuelve size ()), sino que reasigna el búfer interno de modo que no sea necesario reasignar el búfer para crecer a este tamaño (cuando llama a list.add (objeto).
/**
* Increases the capacity of this <tt>ArrayList</tt> instance, if
* necessary, to ensure that it can hold at least the number of elements
* specified by the minimum capacity argument.
*/
Adivinando, creo que lo que estás buscando es
Integer index = Integer.valueOf(676);
Map<Integer,String> strings = new HashMap<Integer,String>();
strings.put(index, "foo");
su longitud es de 676, pero hay que recordar que ellos son cero, así que en realidad, te gustaría índice -1 sería el número máximo.