|
Jede Änderung an einem String bedeutet, dass nicht der Stringinhalt verändert wird, sondern dass jedesmal ein neuer String mit dem geänderten Wert angelegt wird. Das kostet Speicher/Ressourcen/Performance. Hier bietet sich die Klasse StringBuffer an. Diese wird für veränderbare Zeichenketten genutzt. Nach dem Verändern eines Stringbufferobjekts wird kein neues Stringbufferobjekt erzeugt, sondern die Veränderung findet direkt im Objekt statt.
Bsp. für die Ausgabe eines Strings mit 1024 Zeichen.
Hier entsteht bei jedem Durchlauf der for-Schleife ein neuer String mit dem bisherigen Ergebnis erweitert um das neue Zeichen (*). Für n=1024 ergibt sich, da jedes der 1024*1025/2=524.800 Zeichen als Unicode mit zwei Byte kodiert wird, ein Speicherbedarf von mehr als einem Megabyte.
public class Test {
static public void main (String args[]) {
System.out.println(zeigeSterne(1024));
}
static String zeigeSterne(int n) {
String s="";
for (int i=0;i<n;i++) {
s+="*";
}
return s;
}
}
Besser ist eine Lösung mit einem Stringbuffer. Hier wird nur ein Speicherplatz von 2*n Kilobyte benötigt.
public class Test {
static public void main (String args[]) {
System.out.println(getStars(1024));
}
static String getStars(int n) {
StringBuffer s=new StringBuffer();
for (int i=0;i<n;i++) {
s.append("*");
}
return s.toString();
}
}
StringBuffer haben nach dem Anlegen immer einen internen Puffer, in dem die Veränderungen des Stringbuffers vorgenommen werden.
Während length() die Anzahl der Zeichen angibt, ist capacity() immer größer oder gleich length() und sagt etwas darüber aus,
wie viele Zeichen der Puffer noch aufnehmen kann, ohne dass intern ein neues, größeres Feld benötigt würde.
Die Startgröße sollte mit der erwarteten Größe initialisiert werden, um späteres teures internes Vergrößern zu vermeiden.
public class Test {
static public void main (String args[]) {
StringBuffer sb1 = new StringBuffer(); // leeren StringBuffer anlegen, Kapazität ist Standard 16 Zeichen
System.out.println(sb1.length()); // Ausgabe: 0
System.out.println(sb1.capacity()); // Ausgabe: 16
StringBuffer sb2 = new StringBuffer("Hallo");
System.out.println(sb2.length()); // Ausgabe: 5
System.out.println(sb2.capacity()); // Ausgabe: 21 (16+5)
StringBuffer sb3 = new StringBuffer(100); // StringBuffer mit Kapazität initialisieren
System.out.println(sb3.length()); // Ausgabe: 0
System.out.println(sb3.capacity()); // Ausgabe: 100
}
}
|