Es sieht so aus, arraylist
als würde es seine Aufgabe nicht erfüllen:
// presizing
ArrayList<Integer> list = new ArrayList<Integer>(60);
Danach, wenn ich versuche, darauf zuzugreifen:
list.get(5)
Anstatt 0 zurückzugeben, wird IndexOutOfBoundsException: Index 5 für die Länge 0 außerhalb der Grenzen ausgelöst .
Gibt es eine Möglichkeit, alle Elemente mit einer exakten Größe auf 0 zu initialisieren, wie dies in C ++ der Fall ist?
java
collections
Frost
quelle
quelle
Antworten:
Die an den Konstruktor übergebene Ganzzahl stellt ihre Anfangskapazität dar , dh die Anzahl der Elemente, die er halten kann, bevor die Größe seines internen Arrays geändert werden muss (und hat nichts mit der Anfangsanzahl der Elemente in der Liste zu tun).
So initialisieren Sie eine Liste mit 60 Nullen:
Wenn Sie eine Liste mit 60 verschiedenen Objekten erstellen möchten , können Sie die Stream-API
Supplier
wie folgt verwenden:quelle
ArrayList
daraus zu machen und stattdessen einfach zu programmierenList
. Das ist natürlich eine Entscheidung, die dem OP überlassen bleibt.nCopies
ist unveränderlich, daherArrayList
ist es wahrscheinlich eine gute Idee , eine neue zu erstellen .nCopies
mit einem komplexen Objekt die Sammlung nicht mit 60 verschiedenen Objekten instanziiert wird, sondern 60 Mal mit demselben Objekt. Verwenden Sie dies also nur für Grundelemente.nCopies
Referenztypen nützlich sind: Unveränderliche Objekte wie Zeichenfolgen, Nullobjektmuster, Aufzählungskonstanten, ... Wie auch immer, ich habe die Antwort mit einer Lösung zum Erstellen von 60 verschiedenen Objekten aktualisiert.quelle
IndexOutOfBoundsException
mitList<Integer> list = new ArrayList<Integer>(60); Collections.fill(list, new Integer(0)); list.get(5);
Arrays.asList
erzeugt einList
, das das Hinzufügen oder Entfernen nicht zulässt, daher ist es nicht ganz das Gleiche wie das, was das OP will. Es würde funktionieren, wenn Sie nur etwas tun müssenset
, aber in diesem Fall ist es möglicherweise besser, nur ein Array zu verwenden.Die 60, die Sie übergeben, ist nur die anfängliche Kapazität für den internen Speicher. Es ist ein Hinweis darauf, wie groß Sie denken, dass es sein könnte, aber natürlich ist es nicht dadurch eingeschränkt. Wenn Sie Werte voreingestellt haben müssen, müssen Sie diese selbst festlegen, z.
quelle
Java 8-Implementierung (Liste mit
60
Nullen initialisiert ) :new int[N]
- Erstellt ein Array mit Nullen und Länge N.boxed()
- Jedes Element ist mit einer Ganzzahl versehencollect(Collectors.toList())
- sammelt Elemente des Streamsquelle
So ist es nicht. ArrayList verwendet Array nur als interne Atmung. Wenn Sie mehr als 60 Elemente hinzufügen, wird das darunter liegende Array erweitert. Sie können diesem Array jedoch so viele Elemente hinzufügen, wie Sie haben.
quelle