Datenstruktur des Java-Quellcodes Popular Science Series (1): Array

Datenstruktur des Java-Quellcodes Popular Science Series (1): Array

Array-Definition

Schauen Sie sich zunächst die Definition des Arrays an:

Ein Array ist eine geordnete Sammlung von Daten desselben Typs.

Mit „geordnet“ ist hier gemeint, dass es in der richtigen Reihenfolge angeordnet ist und einen kontinuierlichen Speicherplatz einnimmt. Denken Sie nur an die beiden Schlüsselwörter „gleicher Datentyp“ und „zusammenhängender Speicherplatz“. Wenn die Schule beispielsweise Funkturnen durchführt, nimmt jedes Team einen zusammenhängenden Platz auf dem Spielplatz ein und der Abstand zwischen Vorder- und Rückseite ist gleich. Die Schüler dieses Teams bilden zusammen eine „Reihe“.

Wie dieses Team angepasst werden kann, entspricht der Computerwelt, und das Array kann auf beliebige Weise manipuliert werden. Beispielsweise kann ein Klassenkamerad am Kopf, in der Mitte oder am Ende eingefügt werden, ein Klassenkamerad kann entfernt werden, ein Klassenkamerad im Team kann ersetzt werden und der N-te Klassenkamerad kann aufgerufen werden ... Diese Aktionen entsprechen jeweils dem Einfügen des Array im Computer, Löschen, Ersetzen und Direktzugriff.

Die ArrayList-Klasse von Java kapselt allgemeine Operationen für Arrays und ihre übergeordnete Schnittstelle List definiert die folgenden Methoden (nur einige Methoden werden abgefangen):

public interface List<E> extends Collection<E> {
    
    
    boolean add(E e);
    void add(int index, E element);
    E get(int index);
    E set(int index, E element);
    E remove(int index);
}

ArrayList::add

Die Methode add(E e) entspricht dem Hinzufügen eines Klassenkameraden am Ende.

public boolean add(E e) {
    
    
    ensureCapacityInternal(size + 1);  // Increments modCount!!
    elementData[size++] = e;
    return true;
}

Aus dem Code ist ersichtlich, dass der Schüler zunächst bestätigen muss, ob noch ein Platz zum Stehen vorhanden ist. Wenn nicht, muss das Hindernis entfernt werden, um einen größeren zusammenhängenden Raum, also eine „Erweiterung“, zu erhalten Platz, du kannst einfach dazwischenstehen.

Was ist also die maximale Größe eines Arrays in Java? Denn wenn Sie beim Erstellen einer ArrayList eine Größe angeben, wird im Konstruktor ein Array mit der entsprechenden Größe erstellt, sodass wir ArrayList direkt zum Schreiben eines Komponententests verwenden.

@Test
public void maxArraySize() {
    
    
    for (int i = 2; i >= 0; i--) {
    
    
        System.out.println("new ArrayList<Integer>(Integer.MAX_VALUE-" + i + ")");
        try {
    
    
            List<Integer> list = new ArrayList<>(Integer.MAX_VALUE - i);
        } catch (Throwable t) {
    
    
            t.printStackTrace();
        }
    }
}

Die Ausgabe nach dem Ausführen ist wie folgt:

new ArrayList(Integer.MAX_VALUE-2)

java.lang.OutOfMemoryError: Java-Heap-Speicherplatz

new ArrayList(Integer.MAX_VALUE-1)

java.lang.OutOfMemoryError: Angeforderte Array-Größe überschreitet VM-Grenze

new ArrayList(Integer.MAX_VALUE-0)

java. lang.OutOfMemoryError: Die angeforderte Array-Größe überschreitet das VM-Limit

Es ist ersichtlich, dass bei einer Größe von Integer.MAX_VALUE-1 die Grenze der JVM-Array-Größe überschritten wird und der Fehler von Integer.MAX_VALUE-2 auf einen Heap-Speicherüberlauf zurückzuführen ist. Sie können die Startparameter -Xms16G -Xmx16G hinzufügen, um den Heap-Speicher auf 16G anzupassen, damit der Vorgang nicht überläuft, und wie folgt erneut ausgeführt:

new ArrayList(Integer.MAX_VALUE-2)

new ArrayList(Integer.MAX_VALUE-1)

java.lang.OutOfMemoryError: Die angeforderte Array-Größe überschreitet die VM-Grenze.

new ArrayList(Integer.MAX_VALUE-0)

java.lang.OutOfMemoryError: Die angeforderte Array-Größe überschreitet die VM Grenze

Zu diesem Zeitpunkt wird die Ausnahme „java.lang.OutOfMemoryError: Java heap space“ nicht mehr gemeldet.

Die Methode add (int index, E element) besteht darin, einen Klassenkameraden an der angegebenen Position einzufügen.

public void add(int index, E element) {
    rangeCheckForAdd(index);

    ensureCapacityInternal(size + 1);  // Increments modCount!!
    System.arraycopy(elementData, index, elementData, index + 1,
                     size - index);
    elementData[index] = element;
    size++;
}

Prüfen Sie zunächst, ob die einzufügende Stelle existiert. Wenn zum Beispiel nur 30 Personen im Team sind, Sie aber ab der Stelle des 31. Studierenden einfügen möchten, darf diese nicht existieren. Prüfen Sie dann vor dem Einsetzen, ob die Bodenposition ausreichend ist. Der nächste Schritt ist ein Array-Kopiervorgang. Stellen Sie sich vor, wir möchten von vorne einen bestimmten Klassenkameraden einfügen, dann lässt er die Schüler hinter sich zurück und sendet die Nachricht an den letzten Klassenkameraden. Machen Sie weiter so, und das macht einen frei Stelle. Das heißt, die Schüler, die von der vorgesehenen Position aus gestartet waren, rückten alle um eine Position zurück. Endlich können neue Studierende direkt einspringen.

ArrayList::get

Die Methode get(int index) entspricht dem direkten Finden des N-ten Klassenkameraden, aber in der realen Welt beginnt unser N bei 1, während in vielen Sprachen in der Computerwelt N bei 0 beginnt.

public E get(int index) {
    
    
    rangeCheck(index);

    return elementData(index);
}

Die Methode ist relativ einfach: Überprüfen Sie zunächst, ob die Nummer im normalen Bereich liegt, und suchen Sie dann die Station anhand der Nummer, um diesen Schüler zu finden.

ArrayList::set

Die Methode set(int index, E element) entspricht dem Ersetzen des Klassenkameraden an der angegebenen Position durch einen neuen Klassenkameraden.

public E set(int index, E element) {
    
    
    rangeCheck(index);

    E oldValue = elementData(index);
    elementData[index] = element;
    return oldValue;
}

Überprüfen Sie ähnlich wie bei get zunächst, ob die Anzahl im normalen Bereich liegt. Anschließend werden die ersetzten Schüler aus der Warteschlange entfernt und die neuen Schüler hineingeschoben.

ArrayList::remove

Die Methode „remove(int index)“ entspricht dem Auslassen der Schüler an der angegebenen Position aus dem Team.

public E remove(int index) {
    
    
    rangeCheck(index);

    modCount++;
    E oldValue = elementData(index);

    int numMoved = size - index - 1;
    if (numMoved > 0)
        System.arraycopy(elementData, index+1, elementData, index,
                         numMoved);
    elementData[--size] = null; // clear to let GC do its work

    return oldValue;
}

Sie können sich weiterhin vorstellen, dass nach dem Ausscheiden eines Schülers in der Mitte die Schüler dahinter nach vorne gehen müssen, um die freie Stelle zu besetzen. Daher gibt es beim Löschen auch einen Array-Kopiervorgang für den Code.

Zusammenfassung

In diesem Abschnitt geht es um das Konzept von Arrays sowie um die Kapselung und den Betrieb des ArrayList-Quellcodes für Arrays. Anhand der Analogie lässt sich die Anordnung und Abstimmung eines Schülerteams leicht im Kopf einstudieren. Konzentrieren Sie sich auf die Rückwärtsbewegung der Schüler nach hinten, wenn die Mitte eingefügt wird, und auf die Vorwärtsbewegung der Schüler nach hinten, wenn die Mitte entfernt wird. Die Einführung dieses Abschnitts ist abgeschlossen und der Rest wird durch Vorstellungskraft und praktische Fähigkeiten gefestigt.


Achten Sie gerne auf das offizielle Konto, es ist bequemer, Push zu erhalten und bei Problemen zu kommunizieren!

Technischer Langstreckenlauf

Guess you like

Origin blog.csdn.net/CanvaChen/article/details/104011202