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 d'ajout est définie comme add(int index, Object element)
si je n'ajoute pas à l'index 10.
set/add
élément n-1 .ArrayList
. Personnellement, j'aimerais une méthode qui me permettrait de définir une taille telle que je puisse mettre les choses à des indices spécifiques. Cette méthode semble notamment absente.Réponses:
Vous confondez la taille de la liste de baies 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 de tableaux consiste à utiliser une boucle:
Cela fait, vous pouvez maintenant modifier les éléments aux indices 0..9.
la source
while(arr.size() < 10) arr.add(0);
Il peut être utile de dire que la taille doit être d'au moins10
. par exemple pour que vous puissiez utiliserarr.set(9, n);
Si vous voulez une liste avec une taille prédéfinie, vous pouvez également utiliser:
la source
List
est plein de nulls. Avec Guava, nous pouvons faireInts.asList(new int[10])
ce qui initialisera notre liste avec0
s. Modèle propre cependant, merci pour l'exemple.ArrayList
est une implémentation de l'List
interface etArrays.asList
renvoie unArrayList
. Je vous suggère de rechercher le polymorphisme.UnsupportedOperationException
si vous souhaitez utiliser Collections.fill (list, obj); afin de remplir la liste avec un objet répété, vous pouvez également utiliser
la ligne copie 10 fois 0 dans votre ArrayList
la source
La capacité d'un
ArrayList
n'est pas la même que sa taille . La taille est égale au nombre d'éléments contenus dansArrayList
(et toute autreList
implémentation).La capacité est juste la longueur du tableau sous-jacent qui est utilisé pour stocker en interne les éléments de la
ArrayList
, et est toujours supérieure ou égale à la taille de la liste.Lors de l'appel
set(index, element)
sur la liste, le seindex
rapporte au nombre réel des éléments de la liste (= taille) (qui est zéro dans votre code, donc leAIOOBE
est levé), pas à la longueur du tableau (= capacité) (qui est un détail d'implémentation spécifique auArrayList
).La
set
méthode est commune à toutes lesList
implémentations, telles queLinkedList
, qui n'est pas réellement implémentée par un tableau, mais comme une chaîne d'entrées liée.Edit : Vous utilisez en fait la
add(index, element)
méthode, nonset(index, element)
, mais le principe est le même ici.la source
Si vous souhaitez ajouter les éléments avec index, vous pouvez utiliser à la place un tableau.
la source
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 le surcoût d'augmenter la capacité lorsque vous continuez à ajouter des éléments.
la source
Je suppose qu'une réponse exacte à votre question serait:
La définition d'une taille initiale sur une liste de tableaux réduit le nombre. de fois la réallocation de mémoire interne doit se produire. La liste est soutenue par un tableau. Si vous spécifiez par exemple la 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 que votre liste contiendrait, la définition de la capacité initiale réduirait le nombre. des réallocations de mémoire se produisent pendant que vous utilisez la liste.
la source
Cela pourrait aider quelqu'un -
la source
Étant en retard à cela, mais après Java 8 , je trouve personnellement cette approche suivante avec l'
Stream
API plus concise et peut être une alternative à la réponse acceptée .Par exemple,
Arrays.stream(new int[size]).boxed().collect(Collectors.toList())
où
size
est laList
taille souhaitée et sans l'inconvénient mentionné ici , tous les éléments duList
sont initialisés comme0
.(J'ai fait une recherche rapide et je n'ai vu
stream
aucune réponse publiée - n'hésitez pas à me faire savoir si cette réponse est redondante et je peux la supprimer)la source
À l'heure actuelle, il n'y a aucun élément dans votre liste, vous ne pouvez donc pas l'ajouter à l'index 5 de la liste lorsqu'elle n'existe pas. Vous confondez la capacité de la liste avec sa taille actuelle.
Il suffit d'appeler:
ajouter l'entier à votre ArrayList
la source
Bien que votre arraylist ait une capacité de 10, la vraie liste ne contient aucun élément ici. 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.
la source
Si vous souhaitez ajouter 10 éléments à votre,
ArrayList
vous pouvez essayer cela:Si vous avez déjà déclaré une variable de taille de tableau, vous utiliseriez la variable
size
au lieu du nombre «10»la source
J'ai fait face à un problème similaire, et sachant simplement que arrayList est une implémentation de tableau redimensionnable de l'interface List, je m'attends également à ce que vous puissiez ajouter un élément à n'importe quel point, mais au moins avoir la possibilité de définir la taille initiale. Quoi qu'il en soit, vous pouvez d'abord créer un tableau et le convertir en une liste comme:
ou
la source
ArrayList myList = nouveau ArrayList (10);
/ * Déclarer la capacité initiale de l'arrayliste n'est rien d'autre que gagner du temps de changement en interne; lorsque nous ajoutons l'élément en interne, il vérifie la capacité pour augmenter la capacité, vous pouvez ajouter l'élément à l'indice 0 initialement, puis 1 et ainsi de suite. * /
la source
Mes deux cents dessus
Stream
. Je pense qu'il vaut mieux utiliseravec la flexibilité de mettre toutes les valeurs initiales.
la source