Dieser Artikel untersucht hauptsächlich Inhalte von Java ArrayList -Expansionsproblembeispielen wie folgt.
Zunächst müssen wir wissen, dass die Essenz von ArrayList tatsächlich ein Objektarray ist. Das Erweiterungsproblem von ArrayList ist tatsächlich das Erweiterungsproblem dieses Objekt-Array.
transientes Objekt [] elementData;
Es gibt drei Situationen zum Erstellen einer ArrayList
ArrayList al = new ArrayList ();
Nach Abschluss der Erstellung beträgt die Kapazität von AL 0. Sie können aus dem folgenden Code wissen.
transientes Objekt [] elementData; private statisches endgültiges Objekt [] defaultCapacity_Empty_elementData = {}; public arrayList () {this.elementData = defaultCapacity_Empty_elementData;}ArrayList al = New ArrayList (5);
Das Erstellen eines ArrayList -Objekts mit einer Kapazität von 5 ist tatsächlich ein Objektarray mit einer Länge von 5. Sie können aus dem folgenden Code wissen.
transientes Objekt [] elementData; private static Final Object [] defaultCapacity_Empty_elementData = {}; public arrayList (infitialcapacity) {if (initialCapacity> 0) {this.elementData = neues Objekt [initialCapacity]; } else if (initialCapacity == 0) {this.elementData = leer_elementData; } else {werfen neuer illegalArgumentException ("illegale Kapazität:"+ initialCapacity); }}ArrayList al = new ArrayList <Ganzzahl> (arrays.aslist (1, 2, 3, 4, 5));
Das ArrayList -Objekt wird oben erstellt und mithilfe einer Liste als [1,2,3,4,5] initialisiert. Tatsächlich erzeugt es ein Objektarray von Länge 5, und der Inhalt des Arrays beträgt [1, 2, 3, 4, 5]. Sie können aus dem folgenden Code wissen.
private int Größe; transientes Objekt [] elementData; private statisches endgültiges Objekt [] defaultCapacity_Empty_elementData = {}; öffentliche ArrayList (Sammlung <? Erweitert E> c) {elementData = C.toarray (); if ((size = elementData.Length)! } else {// Ersetzen Sie durch leeres Array. this.elementData = leer_elementData; }} ArrayList <Integer> collection = new ArrayList <Grayser> (arrays.aSlist (1, 2, 3, 4, 5)); Integer [] moreints = {6, 7, 8, 9, 10}; Collection.addall (Arrays.aslist (MoreTles)); 1. Erstellen Sie eine ArrayList mit Größe 5 mit Inhalt [1, 2, 3, 4, 5]. - Die anfängliche Kapazität beträgt 5
2. Set {6, 7, 8, 9, 10} zu diesem ArrayList -Objekt. -Zu diesem Zeitpunkt muss die Kapazität dieses ArrayList-Objekts erweitert werden.
public boolean addAll (Sammlung <? Erweitert E> c) {// Erhalten Sie das Einfügen von Array -Objekt [] a = C.toarray (); // Die Inhaltslänge intieren int numnew = A.Length; sealEcapacityInternal (Größe + numNew); // Inkremente modcountsystem.ArrayCopy (a, 0, elementData, numNew); 0;} private void sealecapacityInternal (int mincapacity) {// Wenn der Inhalt in ArrayList leer ist, if (elementData == defaultCapacity_Empty_elementData) {mincapacity = math.max.max (default_capacity, mincapacity); minkapazität) {modcount ++; // Berechnen Sie die erweiterte Größe minkapazität (minkapazität - elementData.länge> 0) wachsen (minkapazität);} private void wachsen (int minkapazität) {// Die ursprüngliche Größe der originalen Größe der originalen Größe der originalen Größe. Newcapacity = OldCapacity + (OldCapacity >> 1); // Vergleiche mit der zuvor berechneten Expansionslänge Minkapazität, nimm das größere als Expansionslänge, wenn (Newcapacity - Mincapacity <0) Newcapacity = Mincapacity; // Wenn die Expansionslänge größer ist als die Maximallänge, wenn (Newcapacity - max_array_array_size> 0) Newcapacity (Newcapacity - max_array_array_size> 0) NewCapacity, wenn (Newcapacity - max_array_array_size> 0) Newkapazität - Newcapacity - max_array_array_array- Hugenkapazität (Minkapazität); // Expansion elementData = arrays.copyof (elementData, Newcapacity);} private statische int Hugenkapazität (int minkapazität) {// Minkapazität ist weniger als 0, was auf Überlauf hinweist. OutofMemoryError (); return (mincapacity> max_array_size)? Integer.max_value: max_array_size;} 1. Die ursprüngliche Größe von ArrayList + Die Größe der Kollektion, die eingesetzt werden soll, numnew = die minimale Länge der erweiterten Arraylist -Mincapacity erhalten
2. Wenn die ursprüngliche Größe der ArrayList 0 beträgt, dh die ArrayList ist leer, die minimale Länge der ArrayList nach Erweiterung minkapazität = math.max (10, mincapacity), dh die minimale Länge der Expansionsgründe ist nicht nur die ursprüngliche Länge zuzüglich der Länge des Insertionssatzes.
3. Die oben erhaltene erweiterte Mindestlänge ist nicht die endgültige erweiterte Länge, und eine weitere Berechnung ist erforderlich.
(1) Erhalten Sie die ursprüngliche Größe der ArrayList OldCapacity
(2) die neue erweiterte Größe erhalten: NewCapacity = OldCapacity*1,5;
(3) Vergleichen Sie die oben berechnete erweiterte Mindestlänge mit der hier erhaltenen Neukapazität der erweiterten Größe und nehmen Sie die größere als endgültige erweiterte Größe an.
Das obige ist die detaillierte Erklärung des Beispiels für das ArrayList -Erweiterungsproblem in diesem Artikel. Ich hoffe, es wird für alle hilfreich sein. Interessierte Freunde können weiterhin auf andere verwandte Themen auf dieser Website verweisen. Wenn es Mängel gibt, hinterlassen Sie bitte eine Nachricht, um darauf hinzuweisen. Vielen Dank an Freunde für Ihre Unterstützung für diese Seite!