String ist eine der am häufigsten verwendeten Klassen in Java. Die Klassen StringBuffer und StringBuilder bieten Methoden zur Manipulation von Strings. Wir werden den Unterschied zwischen StringBuffer und StringBuilder betrachten. StringBuffer vs StringBuilder ist eine beliebte Frage in Java-Interviews.
String vs StringBuffer vs StringBuilder
Der String ist eines der wichtigsten Themen im Kernbereich eines Java-Interviews. Wenn Sie ein Programm schreiben, das etwas auf der Konsole ausgibt, verwenden Sie String. Dieses Tutorial konzentriert sich auf die wichtigsten Funktionen der String-Klasse. Anschließend werden wir die Klassen StringBuffer und StringBuilder vergleichen.
String in Java
-
Die Klasse String repräsentiert Zeichenketten. Wir können String auf zwei Arten instantiieren.
String str = "ABC"; // oder String str = new String("ABC");
-
String ist in Java unveränderlich (immutable). Daher eignet er sich für die Verwendung in einer Multithreading-Umgebung. Wir können ihn über Funktionen hinweg teilen, da keine Bedenken hinsichtlich Dateninkonsistenz bestehen.
-
Wenn wir einen String mit doppelten Anführungszeichen erstellen, sucht die JVM zunächst nach dem String mit dem gleichen Wert im String-Pool. Wenn gefunden, gibt es die Referenz des String-Objekts aus dem Pool zurück. Andernfalls erstellt es das String-Objekt im String-Pool und gibt die Referenz zurück. Die JVM spart viel Speicherplatz, 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 dann gleich, wenn sie die gleiche Zeichenfolge haben. Die equals() Methode ist Groß- und Kleinschreibung beachtet. Wenn Sie nach Groß-/Kleinschreibung nicht unterscheidenden Überprüfungen suchen, sollten Sie die equalsIgnoreCase() Methode verwenden.
-
Der String verwendet die UTF-16-Kodierung 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 unter Verwendung der finalen Felder der String-Klasse mit einigen Berechnungen generiert. Daher führt jeder Aufruf der hashCode()-Methode zu demselben Ergebnis. Für den Aufrufer scheint es, als ob bei jedem Aufruf Berechnungen stattfinden, aber intern wird es im Hash-Feld zwischengespeichert.
String vs StringBuffer
Da String in Java unveränderlich ist, wenn wir String-Manipulationen wie Konkatenation, Teilzeichenkette usw. durchführen, wird ein neuer String generiert und der ältere String zur Garbage Collection verworfen. Dies sind aufwändige Operationen und erzeugen viel Müll im Heap. Daher 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 Methoden wie append(), insert(), delete() und substring() für die String-Manipulation.
StringBuffer vs StringBuilder
StringBuffer war die einzige Wahl für Zeichenkettenmanipulation bis Java 1.4. Aber sie hat den Nachteil, dass alle ihre öffentlichen Methoden synchronisiert sind. StringBuffer bietet Threadsicherheit, aber zu einem Leistungspreis. In den meisten Szenarien verwenden wir String nicht in einer Mehrfadenumgebung. Deshalb wurde in Java 1.5 eine neue Klasse, StringBuilder, eingeführt, die der StringBuffer ähnelt, jedoch ohne Threadsicherheit und Synchronisation. StringBuffer verfügt über einige zusätzliche Methoden wie substring, length, capacity, trimToSize usw. Diese sind jedoch nicht erforderlich, da sie bereits in String vorhanden sind. Aus diesem Grund wurden diese Methoden nie in der StringBuilder-Klasse implementiert. StringBuffer wurde in Java 1.0 eingeführt, während die StringBuilder-Klasse in Java 1.5 eingeführt wurde, nachdem die Mängel von StringBuffer betrachtet wurden. Wenn Sie sich in einer Single-Thread-Umgebung befinden oder Threadsicherheit nicht wichtig ist, sollten Sie StringBuilder verwenden. Andernfalls verwenden Sie StringBuffer für threadsichere Operationen.
I am trying to check the effect on performance because of synchronization with a sample program that performs append()
on StringBuffer and StringBuilder object for multiple times.
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("Time Taken:"+(end-start));
System.out.println("Memory used:"+(startMemory-endMemory));
}
}
I ran the same code for the StringBuffer object also to check the time and memory values. I have executed the code 5 times for each case and then calculated the average values.
Value of i | StringBuffer (Time, Memory) | StringBuilder (Time, Memory) |
---|---|---|
10,00,000 | 808, 149356704 | 633, 149356704 |
1,00,00,000 | 7448, 147783888 | 6179, 147783888 |
Es ist klar, dass StringBuilder selbst in einer Single-Thread-Umgebung besser abschneidet als StringBuffer. Diese Leistungsunterschiede können durch die Synchronisation in den Methoden von StringBuffer 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 es nicht ist. Deshalb ist StringBuilder schneller als StringBuffer.
- Der Operator für die Zeichenkettenverkettung (+) verwendet intern die Klasse StringBuffer oder StringBuilder.
- Für Zeichenkettenmanipulationen in einer nicht-mehrfädigen Umgebung sollten wir StringBuilder verwenden, andernfalls die Klasse StringBuffer.
Das war eine schnelle Übersicht über den Unterschied zwischen String, StringBuffer und StringBuilder. StringBuilder eignet sich in den meisten allgemeinen Programmierszenarien besser als StringBuffer. Referenzen:
Source:
https://www.digitalocean.com/community/tutorials/string-vs-stringbuffer-vs-stringbuilder