wake-up-neo.com

Anfangsgröße für die ArrayList

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.

200
Cemre

Sie verwechseln die Größe der Array-Liste mit ihrer Kapazität:

  • die Größe ist die Anzahl der Elemente in der Liste.
  • die Kapazität gibt an, wie viele Elemente die Liste unterbringen kann, ohne ihre internen Strukturen neu zuzuordnen.

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.

318
NPE

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]);
87

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

36
Farzan Skt

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.

18
Natix

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.

9
Bhesh Gurung

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";
9
user3692587

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.

6
quaylar

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.)

2
H.T. Koo

Das könnte jemandem helfen - 

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

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.

1
roll1987

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

1
Hunter McMillen

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.

1
panther

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.

0
anch2150

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. * /

0
sambhu

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);
0
unk