web-dev-qa-db-fra.com

Insérer à n'importe quelle position dans Java.util.List

Selon la documentation, vous pouvez insérer des objets à n’importe quelle position dans une liste:

L'utilisateur de cette interface a un contrôle précis sur l'emplacement de chaque élément inséré dans la liste.

(source: http://download.Oracle.com/javase/6/docs/api/Java/util/List.html )

Mais le programme suivant échoue avec une exception 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);
        }
    }
}

Cela n'aide pas non plus à définir explicitement la capacité initiale (ce qui est logique puisque la valeur par défaut est 10).

Pourquoi ne puis-je pas insérer d'objets à n'importe quelle position tant que son index est inférieur à la capacité? La taille est-elle toujours égale au nombre d'éléments insérés?

16
fiskeben

Vous pouvez insérer un objet à n’importe quelle position valide. Examinez de près le Javadoc pour add(int, E) :

Lance:
IndexOutOfBoundsException - si l'index est en dehors de la plage (index < 0 || index > size())

En d'autres termes, l'insertion d'un élément augmente toujours la taille de la liste de 1. Vous pouvez insérer à n'importe quelle extrémité ou au milieu ... mais vous ne pouvez pas insérer past la fin.

La capacité d'un ArrayList est en réalité un détail d'implémentation: elle contrôle le moment où le tableau de fond doit être remplacé par un plus grand afin de gérer plus d'éléments. La taille d’une liste est l’essentiel: une liste d’une capacité de 100, mais la taille 5 n’est encore qu’une liste de 5 éléments. Par conséquent, l’insertion en position 67 dans une telle liste n’aurait aucun sens.

24
Jon Skeet

La capacité de la liste n’est pas la même que sa taille.

La capacité est une propriété des listes sauvegardées dans un tableau (telles que ArrayList ou Vector) et correspond à la taille allouée du tableau de sauvegarde (c'est-à-dire le nombre maximal d'éléments que vous pouvez placer avant de devoir agrandir la structure).

Comme vous le dites, la taille est le nombre d'éléments présents dans la liste.

Alors, pourquoi ne seriez-vous pas en mesure d'insérer un élément où vous voulez tant qu'il y a de la place pour cela? Simple, parce que l'interface List ne spécifie pas comment l'objet est sauvegardé et que vous ne pouvez pas le faire avec quelque chose comme une LinkedList; le comportement homogène (et correct) consiste donc à émettre une exception lorsque cela se produit.

Donc, vous avez deux options:

  • Initialisez la liste correctement en ajoutant une valeur par défaut à la taille souhaitée.
  • Si null est une valeur par défaut raisonnable pour vous, vous pouvez utiliser directement un tableau.
2
fortran

maListe.add (2, "herp") devrait être maListe.add (1, "herp")

Comme augmente la taille de la liste est de 1, pas 2.

1
Yuhua Liu

ArrayList a deux membres: capacité et taille

la capacité est la longueur du tableau sous-jacent, la taille est la longueur du tableau représenté par ArrayList.

vous devez donc ajouter des données dans la liste, de sorte que le ArrayList lui-même gagne la taille à laquelle vous souhaitez insérer des données

0
Hachi

La taille de la liste est toujours égale au nombre d'éléments insérés

Throws:
IndexOutOfBoundsException - if the index is out of range (index < 0 || index > size())

javadoc

0
pbanfi

Tout d'abord, myList.add(0, "herp") sera inséré, puis la taille sera vérifiée. Alors, la taille est 1 mais vous insérez à la position 2.