Java Vector trimToSize()-Methode
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
- Wann
VectorWenn 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, dass
Vectorsich der Inhalt nicht mehr ändert und Speicher gespart werden soll
Prinzip der Methodenimplementierung
Quellcodeanalyse
Das Folgende istVectorin der KlassetrimToSize()Implementierung der Methode:
Beispiel
modCount++;
int oldCapacity = elementData.length;
if (elementCount < oldCapacity) {
elementData = Arrays.copyOf(elementData, elementCount);
}
}
Implementierungsschritte
- Erhöhe den Modifikationszähler
modCount(verwendet für den Fail-Fast-Mechanismus) - Ermittle die Kapazität des aktuellen internen Arrays
oldCapacity - Wenn die aktuelle Anzahl der Elemente
elementCountkleiner als die Kapazität des Arrays ist:- Verwenden Sie
Arrays.copyOf()um ein neues Array zu erstellen, ist die GrößeelementCount - Kopieren Sie den ursprünglichen Array-Inhalt in das neue Array
- wird
elementDataRichten Sie die Referenz auf das neue Array
- Verwenden Sie
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ße
Vector, kann diese Operation einen gewissen Performance-Overhead verursachen
Anwendungsbeispiele
Grundlegende Verwendung
Beispiel
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
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 aufrufen
trimToSize(), insbesondere in Schleifen - Wenn festgestellt wird, dass
Vectorwenn sich der Inhalt im Wesentlichen nicht mehr ändert, rufen Sie sie auf - Bei kleinen
Vectorist 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:
VectorNach einer großen Anzahl von Hinzufüge- und Entfernen-Operationen- Umgebungen mit begrenzten Speicherressourcen
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 kleinen
Vectoroder 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