Pourquoi ce code génère-t-il une exception IndexOfOutBoundsException - c'est-à-dire, que se passe-t-il avec EnsureCapacity ()?

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

  •  10-07-2019
  •  | 
  •  

Question

Considérez les deux extraits de code suivants:

int index = 676;
List<String> strings = new ArrayList<String>();
strings.add(index, "foo");

et

int index = 676;
List<String> strings = new ArrayList<String>();
strings.ensureCapacity(index);
strings.add(index, "foo");

Dans le premier cas, je ne suis pas surpris de voir une exception IndexOfOutBoundsException. Selon le L’API , add(int index, E element) émettra une exception IndexOfOutBoundsException & "Si l’index est en dehors de la plage (index < 0 || index > size()) &"; La taille de strings est 0 avant l'ajout d'éléments, donc index sera certainement plus grand que la taille de ArrayList.

Cependant, dans le second cas, je pense que l'appel à ensureCapacity grandira add de sorte que l'appel à "foo" insérera correctement la chaîne add(index, "foo") à l'index 676 - mais ce n'est pas le cas.

  1. Pourquoi pas?

  2. Que dois-je faire pour que index > strings.size() fonctionne avec <=>?

Était-ce utile?

La solution

La capacité du tableau sous-jacent dans un tableau de tableaux est distincte des méthodes de l'API de liste de niveau supérieur (ajout, suppression, etc.) et ne concerne que la taille du tableau de sauvegarde. Si vous souhaitez autoriser l'ajout d'éléments au-delà des limites de la liste, vous devez l'indiquer vous-même (ou trouver une collection qui le fait pour vous) dans une classe d'utilitaires, en renseignant des valeurs NULL, des objets vides ou tout autre élément attendu par votre application. index et l'ancienne taille.

Autres conseils

ArrayList.ensureCapacity () ne modifie pas la taille réelle de la liste (qui est renvoyée par size ()), mais réaffecte plutôt le tampon interne de sorte qu'il ne soit pas nécessaire de le réallouer pour atteindre cette taille (lorsque vous appelez list.add (objet).

/**
 * 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.
 */

Je pense que ce que vous cherchez, c’est que

Integer index = Integer.valueOf(676);
Map<Integer,String> strings = new HashMap<Integer,String>();
strings.put(index, "foo");

votre longueur est de 676, mais vous devez savoir qu’elles sont basées sur zéro. En réalité, vous voudriez que l’index -1 soit votre nombre maximum.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top