Java Vector trimToSize()-Methode

Java Vector Java Vector


trimToSize()ist in Java,Vectoreine von der Klasse bereitgestellte Hilfsmethode, die verwendet wird, um zu optimierenVectorden Speicherverbrauch von. Diese Methode wirdVectordie Kapazität (capacity) an die aktuelle tatsächliche Anzahl gespeicherter Elemente (size) anpassen, wodurch unnötiger Speicherverbrauch reduziert wird.

Methodensyntax

public void trimToSize()

Enthaltende Klasse

java.util.Vector


Zweck der Methode

VectorDie Klasse verwendet intern ein Array, um Elemente zu speichern. WennVectorElemente hinzugefügt werden und das aktuelle Array voll ist,Vectorwird es automatisch erweitert (normalerweise auf das 1.5- oder 2-Fache der aktuellen Kapazität). Obwohl dieser Mechanismus die Effizienz beim Hinzufügen von Elementen verbessert, kann er auch Speicherverschwendung verursachen.

trimToSize()Der Zweck der Methode besteht darin,Vectordie interne Arraygröße so anzupassen, dass sie gerade ausreicht, um alle aktuellen Elemente aufzunehmen, wodurch zusätzlicher Speicherplatz freigegeben wird.

Anwendungsfälle

  • WannVectorWenn eine große Anzahl von Elementen hinzugefügt und anschließend einige Elemente entfernt wurden, sodass die Kapazität viel größer als die tatsächliche Anzahl der Elemente ist
  • In speicherempfindlichen Anwendungen, wenn der Speicherverbrauch optimiert werden muss
  • Wenn festgestellt wird, dassVectorsich der Inhalt nicht mehr ändert und Speicher gespart werden soll

Prinzip der Methodenimplementierung

Quellcodeanalyse

Das Folgende istVectorin der KlassetrimToSize()Implementierung der Methode:

Beispiel

public synchronized void trimToSize() {
    modCount++;
    int oldCapacity = elementData.length;
    if (elementCount < oldCapacity) {
        elementData = Arrays.copyOf(elementData, elementCount);
    }
}

Implementierungsschritte

  1. Erhöhe den ModifikationszählermodCount(verwendet für den Fail-Fast-Mechanismus)
  2. Ermittle die Kapazität des aktuellen internen ArraysoldCapacity
  3. Wenn die aktuelle Anzahl der ElementeelementCountkleiner als die Kapazität des Arrays ist:
    • Verwenden SieArrays.copyOf()um ein neues Array zu erstellen, ist die GrößeelementCount
    • Kopieren Sie den ursprünglichen Array-Inhalt in das neue Array
    • wirdelementDataRichten Sie die Referenz auf das neue Array

Hinweise

  • Diese Methode ist synchronisiert (synchronized), threadsicher
  • Nach dem Aufruf dieser Methode, wenn erneut neue Elemente hinzugefügt werden,Vectorwird es weiterhin automatisch erweitert
  • Für großeVector, kann diese Operation einen gewissen Performance-Overhead verursachen

Anwendungsbeispiele

Grundlegende Verwendung

Beispiel

import java.util.Vector;

public class VectorTrimToSizeExample {
    public static void main(String[] args) {
        // Erstelle einen Vector mit einer Anfangskapazität von 10
        Vector<String> vector = new Vector<>(10);
       
        // 5 Elemente hinzufügen
        for (int i = 0; i < 5; i++) {
            vector.add("Item " + (i + 1));
        }
       
        System.out.println("Size: " + vector.size());      // Ausgabe: 5
        System.out.println("Kapazität: " + vector.capacity()); // Ausgabe: 10
       
        // trimToSize() aufrufen
        vector.trimToSize();
       
        System.out.println("Kapazität nach dem Trimmen: " + vector.capacity()); // Ausgabe: 5
    }
}

Praktische Anwendungsszenarien

Beispiel

import java.util.Vector;

public class VectorMemoryOptimization {
    public static void main(String[] args) {
        // Simuliere ein Szenario zur Verarbeitung großer Datenmengen
        Vector<Integer> data = new Vector<>(10000);
       
        // Eine große Datenmenge hinzufügen
        for (int i = 0; i < 8000; i++) {
            data.add(i);
        }
       
        // Nach der Verarbeitung der Daten die Hälfte löschen
        for (int i = 0; i < 4000; i++) {
            data.remove(0);
        }
       
        System.out.println("Vor dem Trimmen - Größe: " + data.size() +
                          ", Kapazität: " + data.capacity());
        // Ausgabe: Vor dem Trimmen - Größe: 4000, Kapazität: 10000
       
        // Speicherverbrauch optimieren
        data.trimToSize();
       
        System.out.println("Nach dem Trimmen - Größe: " + data.size() +
                         ", Kapazität: " + data.capacity());
        // Ausgabe: Nach dem Trimmen - Größe: 4000, Kapazität: 4000
    }
}

Leistungsüberlegungen

Zeitkomplexität

trimToSize()Die Zeitkomplexität der Methode ist O(n), wobei nVectordie Anzahl der Elemente darin ist. Denn sie muss das ursprüngliche Array in das neue Array kopieren.

Speicherkomplexität

Diese Methode erstellt ein neues Array, verwendet also vorübergehend zusätzlichen Speicherplatz, gibt aber schließlich den überschüssigen Speicher frei.

Empfehlungen zur Verwendung

  • Nicht häufig aufrufentrimToSize(), insbesondere in Schleifen
  • Wenn festgestellt wird, dassVectorwenn sich der Inhalt im Wesentlichen nicht mehr ändert, rufen Sie sie auf
  • Bei kleinenVectorist der Optimierungseffekt nicht offensichtlich und kann ignoriert werden

Vergleich mit anderen Methoden

Vergleich mit trimToSize() von ArrayList

ArrayListhat auchtrimToSize()Methode, das Implementierungsprinzip ist ähnlich, aberArrayListihre Methode ist nicht synchronisiert.

Vergleich mit ensureCapacity()

Methode Zweck Parameters Threadsicherheit
trimToSize() Kapazität auf aktuelle Größe verkleinern Keine Ja
ensureCapacity(int minCapacity) Mindestkapazität sicherstellen Mindestkapazitätswert Ja

Zusammenfassung

Vector.trimToSize()ist eine praktische Speicheroptimierungsmethode, besonders geeignet für die folgenden Szenarien:

  1. VectorNach einer großen Anzahl von Hinzufüge- und Entfernen-Operationen
  2. Umgebungen mit begrenzten Speicherressourcen
  3. VectorWenn feststeht, dass sich der Inhalt nicht mehr ändert

Beachten Sie bei der Verwendung Folgendes:

  • Diese Methode erstellt ein neues Array und kopiert Elemente, was einen gewissen Leistungsaufwand verursacht.
  • Wenn nach dem Aufruf erneut Elemente hinzugefügt werden,Vectorwird es weiterhin automatisch erweitert
  • Bei kleinenVectoroder sich häufig ändern,Vector, muss sie möglicherweise nicht verwendet werden

Sinnvolle VerwendungtrimToSize()kann dazu beitragen, die Effizienz der Speichernutzung von Java-Programmen zu optimieren.

Java Vector Java Vector

Andere Erweiterungen