¿Por qué hace este código lanzar un IndexOfOutBoundsException - aka, ¿qué pasa con ensureCapacity()?

StackOverflow https://stackoverflow.com/questions/1644741

  •  10-07-2019
  •  | 
  •  

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í.

  1. ¿Por qué no?

  2. ¿Qué debo hacer para que add(index, "foo") obras para index > strings.size()?

¿Fue útil?

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.

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