Sie können die Anfangsgröße für eine ArrayList festlegen, indem Sie dies tun
ArrayList<Integer> arr=new ArrayList<Integer>(10);
Das kannst du aber nicht
arr.add(5, 10);
weil es eine Ausnahme außerhalb der Grenzen verursacht.
Was nützt es, eine Anfangsgröße festzulegen, wenn Sie nicht auf den von Ihnen zugewiesenen Speicherplatz zugreifen können?
Die Add-Funktion ist so definiert, add(int index, Object element)
dass ich nicht zu Index 10 hinzufüge.
set/add
Element n-1 verwenden können .ArrayList
. Ich persönlich hätte gerne eine Methode, mit der ich eine Größe festlegen kann, bei der ich bestimmte Indizes eingeben kann. Diese Methode scheint besonders abwesend zu sein.Antworten:
Sie verwechseln die Größe der Array-Liste mit ihrer Kapazität:
Wenn Sie anrufen
new ArrayList<Integer>(10)
, legen Sie die anfängliche Kapazität der Liste fest , nicht ihre Größe. Mit anderen Worten, wenn die Array-Liste auf diese Weise erstellt wird, beginnt ihr Leben leer.Eine Möglichkeit, der Array-Liste zehn Elemente hinzuzufügen, ist die Verwendung einer Schleife:
Anschließend können Sie Elemente an den Indizes 0..9 ändern.
quelle
while(arr.size() < 10) arr.add(0);
Es kann nützlich sein zu sagen, dass die Größe mindestens sein muss10
. zB so können Sie verwendenarr.set(9, n);
Wenn Sie eine Liste mit einer vordefinierten Größe wünschen, können Sie auch Folgendes verwenden:
quelle
List
ist voller Nullen. Mit Guava können wir tun,Ints.asList(new int[10])
was unsere Liste mit0
s initialisiert . Sauberes Muster, danke für das Beispiel.ArrayList
ist eine Implementierung derList
Schnittstelle undArrays.asList
gibt eine zurückArrayList
. Ich schlage vor, Sie suchen nach Polymorphismus.UnsupportedOperationException
wenn Sie Collections.fill (list, obj) verwenden möchten; Um die Liste mit einem wiederholten Objekt zu füllen, können Sie alternativ verwenden
Die Zeile kopiert 10 mal 0 in Ihre ArrayList
quelle
Die Kapazität eines
ArrayList
ist nicht gleich seiner Größe . Die Größe entspricht der Anzahl der Elemente, die in derArrayList
(und jeder anderenList
Implementierung) enthalten sind.Die Kapazität ist nur die Länge des zugrunde liegenden Arrays, das zum internen Speichern der Elemente des Arrays verwendet wird
ArrayList
, und ist immer größer oder gleich der Größe der Liste.Beim Aufrufen
set(index, element)
der Listeindex
bezieht sich das auf die tatsächliche Anzahl der Listenelemente (= Größe) (die in Ihrem Code Null ist, daherAIOOBE
wird die ausgelöst), nicht auf die Array-Länge (= Kapazität) (die ein Implementierungsdetail ist) zumArrayList
).Die
set
Methode ist allenList
Implementierungen gemeinsam, z. B.LinkedList
die nicht von einem Array implementiert werden, sondern als verknüpfte Kette von Einträgen.Bearbeiten : Sie verwenden die
add(index, element)
Methode tatsächlich nichtset(index, element)
, aber das Prinzip ist hier das gleiche.quelle
Wenn Sie die Elemente mit Index hinzufügen möchten, können Sie stattdessen ein Array verwenden.
quelle
10 ist die Anfangskapazität des AL, nicht die Größe (die 0 ist). Sie sollten die anfängliche Kapazität mit einem hohen Wert erwähnen, wenn Sie viele Elemente haben möchten, da dadurch der Aufwand für die Erweiterung der Kapazität beim Hinzufügen von Elementen vermieden wird.
quelle
Ich denke, eine genaue Antwort auf Ihre Frage wäre:
Durch Festlegen einer Anfangsgröße in einer ArrayList wird die Anzahl reduziert. Oft muss eine Neuzuweisung des internen Speichers erfolgen. Die Liste wird von einem Array unterstützt. Wenn Sie dh die Anfangskapazität 0 angeben, muss die Größe des internen Arrays 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 das Festlegen der Anfangskapazität die Anzahl verringern. von Speicher-Neuzuweisungen, die während der Verwendung der Liste stattfinden.
quelle
Dies könnte jemandem helfen -
quelle
Da ich zu spät komme, aber nach Java 8 finde ich diesen folgenden Ansatz mit der
Stream
API persönlicher und kann eine Alternative zur akzeptierten Antwort sein .Beispielsweise,
Arrays.stream(new int[size]).boxed().collect(Collectors.toList())
Wo
size
ist die gewünschteList
Größe und ohne den hier erwähnten Nachteil werden alle Elemente in derList
als initialisiert0
.(Ich habe eine schnelle Suche durchgeführt und
stream
keine Antworten gefunden. Sie können mich gerne informieren, wenn diese Antwort überflüssig ist und ich sie entfernen kann.)quelle
Derzeit enthält Ihre Liste keine Elemente, sodass Sie sie nicht zu Index 5 der Liste hinzufügen können, wenn sie nicht vorhanden ist. Sie verwechseln die Kapazität der Liste mit der aktuellen Größe.
Ruf einfach an:
um die Ganzzahl zu Ihrer ArrayList hinzuzufügen
quelle
Obwohl Ihre Arrayliste eine Kapazität von 10 hat, enthält die reale Liste hier keine Elemente. Die Methode add 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 5 einfügen.
quelle
Wenn Sie Ihrem Artikel 10 Elemente hinzufügen möchten, können
ArrayList
Sie Folgendes versuchen:Wenn Sie bereits eine Variable für die Arraygröße deklariert haben, verwenden Sie die Variable
size
anstelle der Zahl '10'.quelle
Ich hatte mit einem ähnlichen Problem zu kämpfen, und da ich nur weiß, dass die ArrayList eine Array-Implementierung mit veränderbarer Größe der List-Schnittstelle ist, erwarte ich auch, dass Sie jedem Punkt ein Element hinzufügen können, aber zumindest die Option haben, die Anfangsgröße zu definieren. Wie auch immer, Sie können zuerst ein Array erstellen und dieses in eine Liste wie folgt konvertieren:
oder
quelle
ArrayList myList = new ArrayList (10);
/ * Erklären Sie, dass die anfängliche Kapazität von Arraylist nichts anderes ist, als intern Schaltzeit zu sparen. Wenn wir das Element intern hinzufügen, wird die Kapazität überprüft, um die Kapazität zu erhöhen. Sie können das Element zunächst mit dem Index 0, dann mit 1 und so weiter hinzufügen. * /
quelle
Meine zwei Cent weiter
Stream
. Ich denke, es ist besser zu verwendenmit der Flexibilität, Anfangswerte zu setzen.
quelle