Sie können die Anfangsgröße für eine ArrayList festlegen
ArrayList<Integer> arr=new ArrayList<Integer>(10);
Sie können jedoch nicht tun
arr.add(5, 10);
weil es eine außerhalb der Grenzen liegende Ausnahme verursacht.
Wie können Sie eine Anfangsgröße festlegen, wenn Sie nicht auf den zugewiesenen Speicherplatz zugreifen können?
Die Add-Funktion ist als add(int index, Object element)
definiert, also füge ich nicht Index 10 hinzu.
Sie verwechseln die Größe der Array-Liste mit ihrer Kapazität:
Wenn Sie new ArrayList<Integer>(10)
aufrufen, legen Sie die anfängliche Kapazität der Liste fest, nicht ihre Größe. Mit anderen Worten, bei dieser Konstruktion beginnt die Array-Liste leer.
Eine Möglichkeit, zehn Elemente zur Array-Liste hinzuzufügen, ist die Verwendung einer Schleife:
for (int i = 0; i < 10; i++) {
arr.add(0);
}
Danach können Sie nun die Elemente in den Indizes 0..9 ändern.
Wenn Sie eine Liste mit einer vordefinierten Größe wünschen, können Sie auch Folgendes verwenden:
List<Integer> arr = Arrays.asList(new Integer[10]);
wenn Sie Collections.fill (list, obj) verwenden möchten; Um die Liste mit einem wiederholten Objekt zu füllen, können Sie alternativ verwenden
ArrayList<Integer> arr=new ArrayList<Integer>(Collections.nCopies(10, 0));
die Zeile wird 10 mal 0 in Ihre ArrayList kopiert
Kapazität einer ArrayList
stimmt nicht mit ihrer Größe überein. Size ist gleich der Anzahl der Elemente, die in der ArrayList
enthalten sind (und jeder anderen List
-Implementierung).
Die Kapazität ist nur die Länge des zugrunde liegenden Arrays, das zum internen Speichern der Elemente der ArrayList
verwendet wird, und ist immer größer oder gleich der size der Liste.
Beim Aufruf von set(index, element)
in der Liste bezieht sich die index
auf die tatsächliche Anzahl der Listenelemente (= size) (die in Ihrem Code null ist, daher wird die AIOOBE
geworfen), nicht auf die Arraylänge (= Kapazität) (die eine Implementierungsdetails für die ArrayList
).
Die set
-Methode gilt für alle List
-Implementierungen, z. B. LinkedList
, die nicht von einem Array implementiert werden, sondern als verknüpfte Eintragskette.
Edit : Sie verwenden zwar die add(index, element)
-Methode, nicht set(index, element)
, aber das Prinzip ist hier dasselbe.
10 ist die anfängliche Kapazität der AL, nicht die Größe (die 0 ist). Sie sollten die anfängliche Kapazität zu einem hohen Wert erwähnen, wenn Sie über viele Elemente verfügen, da dadurch der Aufwand für die Erweiterung der Kapazität umgangen wird, wenn Sie weitere Elemente hinzufügen.
Wenn Sie die Elemente mit Index hinzufügen möchten, können Sie stattdessen ein Array verwenden.
String [] test = new String[length];
test[0] = "add";
Ich denke, eine genaue Antwort auf Ihre Frage wäre:
Durch das Festlegen einer Anfangsgröße für eine ArrayList wird die Anzahl verringert. Manchmal muss eine Neuzuordnung des internen Speichers erfolgen ..__ Die Liste wird durch ein Array gesichert. Wenn Sie zB die Anfangskapazität 0 angeben, müsste das interne Array bereits beim ersten Einfügen eines Elements geändert werden .. Wenn Sie eine ungefähre Vorstellung davon haben, wie viele Elemente Ihre Liste enthalten würde, würde die Einstellung der Anfangskapazität den Wert verringern Nr. von Speicherzuordnungen, die auftreten, während Sie die Liste verwenden.
Da ich zu spät dran bin, aber nach Java 8 , finde ich diesen Ansatz mit der Stream
-API persönlich prägnanter und kann eine Alternative sein bis die akzeptierte Antwort .
Zum Beispiel,
Arrays.stream(new int[size]).boxed().collect(Collectors.toList())
dabei ist size
die gewünschte List
-Größe und ohne der hier erwähnte Nachteil , alle Elemente in List
werden als 0
initialisiert. .
(Ich habe eine schnelle Suche durchgeführt und habe in keiner Antwort stream
gefunden. Bitte teilen Sie mir mit, ob diese Antwort überflüssig ist und ich sie entfernen kann.)
Das könnte jemandem helfen -
ArrayList<Integer> integerArrayList = new ArrayList<>(Arrays.asList(new Integer[10]));
Obwohl Ihre Arrayliste eine Kapazität von 10 hat, enthält die echte Liste hier keine Elemente. Die add-Methode wird verwendet, um ein Element in die reale Liste einzufügen. Da es keine Elemente enthält, können Sie kein Element in den Index von 5 einfügen.
Momentan befinden sich keine Elemente in Ihrer Liste. Sie können also keinen Index 5 der Liste hinzufügen, wenn er nicht vorhanden ist. Sie verwechseln die Kapazität der Liste mit der aktuellen Größe.
Ruf einfach an:
arr.add(10)
um die Ganzzahl zu Ihrer ArrayList hinzuzufügen
Wenn Sie Ihrer ArrayList
10 Elemente hinzufügen möchten, können Sie Folgendes versuchen:
for (int i = 0; i < 10; i++)
arr.add(i);
Wenn Sie bereits eine Variable für die Arraygröße deklariert haben, verwenden Sie statt der Zahl '10' die Variable size
.
Meine zwei Cent auf Stream
. Ich denke, es ist besser zu benutzen
IntStream.generate(i -> MyClass.contruct())
.limit(INT_SIZE)
.collect(Collectors.toList());
mit der Flexibilität, Anfangswerte zu setzen.
ArrayList myList = neue 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);
}
/ * Die anfängliche Kapazität von arraylist zu deklarieren ist nichts anderes als die interne Verschiebung von Verschiebungszeit; Wenn wir das Element intern hinzufügen, überprüfen Sie die Kapazität, um die Kapazität zu erhöhen. Sie können das Element bei 0 zuerst hinzufügen, dann 1 und so weiter. * /
Ich war mit einem ähnlichen Problem konfrontiert und wusste nur, dass die ArrayList eine anpassbare Array-Implementierung der List-Schnittstelle ist. Ich erwarte auch, dass Sie jedem Punkt ein Element hinzufügen können, aber zumindest die Option haben, die Anfangsgröße zu definieren. Jedenfalls können Sie zuerst ein Array erstellen und dieses in eine Liste wie die folgende konvertieren:
int index = 5;
int size = 10;
Integer[] array = new Integer[size];
array[index] = value;
...
List<Integer> list = Arrays.asList(array);
oder
List<Integer> list = Arrays.asList(new Integer[size]);
list.set(index, value);