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.
Vous confondez la taille de la liste avec sa capacité:
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.
Si vous voulez une liste avec une taille prédéfinie, vous pouvez aussi utiliser:
List<Integer> arr = Arrays.asList(new Integer[10]);
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
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.
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.
Si vous souhaitez ajouter les éléments avec index, vous pouvez utiliser un tableau.
String [] test = new String[length];
test[0] = "add";
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.
Cela pourrait aider quelqu'un -
ArrayList<Integer> integerArrayList = new ArrayList<>(Arrays.asList(new Integer[10]));
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.
À 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
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'.
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.
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. * /
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);