Java String, StringBuffer und StringBuilder im Vergleich
String ist eine der am häufigsten verwendeten Klassen in Java. Die Klassen StringBuffer und StringBuilder bieten Methoden zur Manipulation von Strings. Wir werden StringBuffer und StringBuilder im Vergleich untersuchen. StringBuffer vs. StringBuilder ist eine beliebte Java-Interviewfrage.
Was ist der Unterschied zwischen Java String, StringBuffer und StringBuilder?
String ist eines der wichtigsten Themen im Core-Java-Interview. Wenn Sie ein Programm schreiben, das etwas auf der Konsole ausgibt, verwenden Sie String. Dieses Tutorial zielt darauf ab, sich auf die wichtigsten Funktionen der String-Klasse zu konzentrieren. Dann werden wir die Klassen StringBuffer und StringBuilder vergleichen.
String in Java
- Die String-Klasse repräsentiert Zeichenketten, wir können String auf zwei Arten instanziieren.
String str = "ABC"; // oder String str = new String("ABC");
- String ist in Java unveränderlich (immutable). Daher ist es geeignet für die Verwendung in einer Multithreading-Umgebung. Wir können es über Funktionen hinweg teilen, da es keine Bedenken bezüglich Dateninkonsistenz gibt.
- Wenn wir einen String mit doppelten Anführungszeichen erstellen, sucht die JVM zuerst nach dem String mit dem gleichen Wert im String-Pool. Wenn gefunden, gibt sie die Referenz des String-Objekts aus dem Pool zurück. Andernfalls erstellt sie das String-Objekt im String-Pool und gibt die Referenz zurück. Die JVM spart viel Speicher, indem sie denselben String in verschiedenen Threads verwendet.
- Wenn der new-Operator verwendet wird, um einen String zu erstellen, wird er im Heap-Speicher erstellt.
- Der + Operator ist für String überladen. Wir können ihn verwenden, um zwei Strings zu verketten. Intern verwendet er jedoch StringBuffer, um diese Aktion auszuführen.
- String überschreibt die equals()- und hashCode()-Methoden. Zwei Strings sind nur gleich, wenn sie dieselbe Zeichenfolge haben. Die equals()-Methode ist groß- und kleinschreibungssensitiv. Wenn Sie nach groß- und kleinschreibungsunabhängigen Überprüfungen suchen, sollten Sie die equalsIgnoreCase()-Methode verwenden.
- String verwendet die UTF-16-Codierung für den Zeichenstrom.
- String ist eine finale Klasse. Alle Felder sind final, außer „private int hash“. Dieses Feld enthält den Wert der hashCode()-Funktion. Der Hashcode-Wert wird nur berechnet, wenn die hashCode()-Methode zum ersten Mal aufgerufen wird, und dann in diesem Feld zwischengespeichert. Darüber hinaus wird der Hash mit einigen Berechnungen unter Verwendung der finalen Felder der String-Klasse generiert. Daher führt jeder Aufruf der hashCode()-Methode zum gleichen Ergebnis. Für den Aufrufer scheint es, als würden die Berechnungen jedes Mal stattfinden, aber intern wird es im Hash-Feld zwischengespeichert.
String vs StringBuffer
Da String in Java unveränderlich ist, erzeugt jede String-Manipulation wie Verkettung, Substring usw. einen neuen String und verwirft den älteren String zur Müllsammlung. Das sind schwere Operationen und erzeugen viel Müll im Heap. Deshalb hat Java die Klassen StringBuffer und StringBuilder bereitgestellt, die für die String-Manipulation verwendet werden sollten. StringBuffer und StringBuilder sind veränderbare Objekte in Java. Sie bieten append(), insert(), delete() und substring()-Methoden zur String-Manipulation.
StringBuffer vs StringBuilder
StringBuffer war bis Java 1.4 die einzige Wahl für die String-Manipulation. Aber es hat einen Nachteil, dass alle seine öffentlichen Methoden synchronisiert sind. StringBuffer bietet Thread-Sicherheit, aber auf Kosten der Leistung. In den meisten Szenarien verwenden wir String nicht in einer multithreaded Umgebung. Deshalb hat Java 1.5 eine neue Klasse StringBuilder eingeführt, die ähnlich wie StringBuffer ist, außer für Thread-Sicherheit und Synchronisierung. StringBuffer hat einige zusätzliche Methoden wie substring, length, capacity, trimToSize usw. Diese sind jedoch nicht erforderlich, da Sie all diese auch in String haben. Deshalb wurden diese Methoden nie in der StringBuilder-Klasse implementiert. StringBuffer wurde in Java 1.0 eingeführt, während die Builder-Klasse in Java 1.5 nach Betrachtung der Mängel von StringBuffer eingeführt wurde. Wenn Sie sich in einer Single-Thread-Umgebung befinden oder sich nicht um Thread-Sicherheit kümmern, sollten Sie StringBuilder verwenden. Andernfalls verwenden Sie StringBuffer für thread-sichere Operationen.
Leistung von StringBuilder vs StringBuffer
Ich versuche, den Effekt auf die Leistung aufgrund der Synchronisierung mit einem Beispielprogramm zu überprüfen, das append() mehrmals auf ein StringBuffer- und ein StringBuilder-Objekt ausführt.
package com.journaldev.java;
import java.util.GregorianCalendar;
public class TestString {
public static void main(String[] args) {
System.gc();
long start=new GregorianCalendar().getTimeInMillis();
long startMemory=Runtime.getRuntime().freeMemory();
StringBuffer sb = new StringBuffer();
//StringBuilder sb = new StringBuilder();
for(int i = 0; i<10000000; i++){
sb.append(":").append(i);
}
long end=new GregorianCalendar().getTimeInMillis();
long endMemory=Runtime.getRuntime().freeMemory();
System.out.println("Benötigte Zeit:"+(end-start));
System.out.println("Verwendeter Speicher:"+(startMemory-endMemory));
}
}
Ich habe denselben Code auch für das StringBuffer-Objekt ausgeführt, um die Zeit- und Speicherwerte zu überprüfen. Ich habe den Code 5 Mal für jeden Fall ausgeführt und dann die Durchschnittswerte berechnet.
Wert von i | StringBuffer (Zeit, Speicher) | StringBuilder (Zeit, Speicher) |
---|---|---|
10,00,000 | 808, 149356704 | 633, 149356704 |
1,00,00,000 | 7448, 147783888 | 6179, 147783888 |
Es ist klar, dass StringBuilder in einer Single-Thread-Umgebung besser als StringBuffer abschneidet. Dieser Unterschied in der Leistung kann durch die Synchronisierung in den StringBuffer-Methoden verursacht werden.
String vs StringBuffer vs StringBuilder
-
- String ist unveränderlich, während StringBuffer und StringBuilder veränderbare Klassen sind.
- StringBuffer ist thread-sicher und synchronisiert, während StringBuilder dies nicht ist. Deshalb ist StringBuilder schneller als StringBuffer.
- Der String-Verkettungsoperator (+) verwendet intern die Klassen StringBuffer oder StringBuilder.
- Für String-Manipulationen in einer nicht-multithreaded Umgebung sollten wir StringBuilder verwenden, sonst die StringBuffer-Klasse.
Das ist alles für eine kurze Zusammenfassung der Unterschiede zwischen String, StringBuffer und StringBuilder. StringBuilder ist in den meisten allgemeinen Programmierszenarien besser geeignet als StringBuffer.