web-dev-qa-db-fra.com

Taille initiale de la liste de tableaux

Vous pouvez définir la taille initiale d’une liste de tableaux en faisant

ArrayList<Integer> arr=new ArrayList<Integer>(10);

Cependant, vous ne pouvez pas faire

arr.add(5, 10);

car il provoque une exception hors limites.

À quoi sert de définir une taille initiale si vous ne pouvez pas accéder à l'espace que vous avez alloué?

La fonction add étant définie par add(int index, Object element), je n’ajoute pas à l’index 10.

200
Cemre

Vous confondez la taille de la liste avec sa capacité:

  • la taille est le nombre d'éléments de la liste;
  • la capacité est le nombre d'éléments que la liste peut potentiellement contenir sans réaffecter ses structures internes.

Lorsque vous appelez new ArrayList<Integer>(10), vous définissez la capacité initiale de la liste, pas sa taille. En d'autres termes, lorsqu'elle est construite de cette manière, la liste de tableaux commence sa vie vide.

Une façon d'ajouter dix éléments à la liste est d'utiliser une boucle:

for (int i = 0; i < 10; i++) {
  arr.add(0);
}

Ceci fait, vous pouvez maintenant modifier des éléments aux indices 0..9.

318
NPE

Si vous voulez une liste avec une taille prédéfinie, vous pouvez aussi utiliser:

List<Integer> arr = Arrays.asList(new Integer[10]);
87

si vous voulez utiliser Collections.fill (list, obj); afin de remplir la liste avec un objet répété, vous pouvez également utiliser

ArrayList<Integer> arr=new ArrayList<Integer>(Collections.nCopies(10, 0));

la ligne copie 10 fois 0 dans votre ArrayList

36
Farzan Skt

La capacité d’une ArrayList n’est pas la même chose que sa taille . Taille est égal au nombre d'éléments contenus dans la variable ArrayList (et dans toute autre implémentation List).

La capacité est simplement la longueur du tableau sous-jacent utilisé pour stocker en interne les éléments de la ArrayList, et est toujours supérieure ou égale à la taille de la liste.

Lorsque vous appelez set(index, element) dans la liste, la variable index correspond au nombre réel des éléments de la liste (= taille) (ce qui correspond à zéro dans votre code; par conséquent, la variable AIOOBE est levée), et détail d’implémentation spécifique à la ArrayList).

La méthode set est commune à toutes les implémentations List, telles que LinkedList, qui n'est pas réellement implémentée par un tableau, mais sous la forme d'une chaîne d'entrées liées.

Edit : Vous utilisez réellement la méthode add(index, element), pas set(index, element), mais le principe est le même ici.

18
Natix

10 est la capacité initiale de l'AL, pas la taille (qui est 0). Vous devez mentionner la capacité initiale à une valeur élevée lorsque vous allez avoir beaucoup d’éléments, car cela évite la surcharge liée à l’augmentation de la capacité tout en continuant d’ajouter des éléments.

9
Bhesh Gurung

Si vous souhaitez ajouter les éléments avec index, vous pouvez utiliser un tableau.

    String [] test = new String[length];
    test[0] = "add";
9
user3692587

Je suppose qu'une réponse exacte à votre question serait:

Définir une taille initiale sur une ArrayList réduit le nombre. La réallocation de la mémoire interne doit avoir lieu plusieurs fois. La liste est sauvegardée par un tableau. Si vous spécifiez ie capacité initiale 0, dès la première insertion d'un élément, le tableau interne devra être redimensionné . Si vous avez une idée approximative du nombre d'éléments de votre liste, définir la capacité initiale réduirait la nr. de réallocations de la mémoire pendant l’utilisation de la liste.

6
quaylar

Cela pourrait aider quelqu'un - 

ArrayList<Integer> integerArrayList = new ArrayList<>(Arrays.asList(new Integer[10]));
1
Hrishikesh Kadam

Bien que votre liste de lecteurs ait une capacité de 10, la liste réelle ne contient aucun élément. La méthode add est utilisée pour insérer un élément dans la liste réelle. Comme il ne contient aucun élément, vous ne pouvez pas insérer d'élément dans l'index de 5.

1
roll1987

À l'heure actuelle, votre liste ne contient aucun élément, vous ne pouvez donc pas l'ajouter à l'index 5 de la liste s'il n'existe pas Vous confondez la capacité de la liste avec sa taille actuelle. 

Il suffit d'appeler:

arr.add(10)

ajouter l'entier à votre ArrayList

1
Hunter McMillen

Si vous souhaitez ajouter 10 éléments à votre ArrayList, essayez ceci:

for (int i = 0; i < 10; i++)
    arr.add(i);

Si vous avez déjà déclaré une variable de taille de tableau, utilisez la variable size au lieu du nombre '10'.

1
panther

Mes deux cents sur Stream. Je pense qu'il vaut mieux utiliser

IntStream.generate(i -> MyClass.contruct())
         .limit(INT_SIZE)
         .collect(Collectors.toList());

avec la flexibilité de mettre toutes les valeurs initiales.

0
anch2150

ArrayList myList = new ArrayList (10);

//  myList.add(3, "DDD");
//  myList.add(9, "III");
    myList.add(0, "AAA");
    myList.add(1, "BBB");

    for(String item:myList){
        System.out.println("inside list : "+item);
    }

/ * Déclarer que la capacité initiale d’arraylist n’est rien d’ autre que de gagner du temps en interne; lorsque nous ajoutons l'élément en interne, nous vérifions la capacité pour augmenter la capacité, vous pouvez ajouter l'élément à l'indice 0 initialement puis à 1 et ainsi de suite. * /

0
sambhu

Je me suis heurté au même problème et je savais que vous pouviez ajouter un élément à n’importe quel point, tout en sachant que arrayList était une implémentation de tableau redimensionnable de l’interface List. De toute façon, vous pouvez d’abord créer un tableau et le convertir en une liste comme celle-ci:

  int index = 5;
  int size = 10;

  Integer[] array = new Integer[size];
  array[index] = value;
  ...
  List<Integer> list = Arrays.asList(array);

ou

  List<Integer> list = Arrays.asList(new Integer[size]);
  list.set(index, value);
0
unk