[JAVA] Unterschied zwischen StringBuilder und StringBuffer

Am Anfang

"Bitte erläutern Sie den Unterschied zwischen StringBuilder und StringBuffer." Sagte, "String Builder hat eine bessere Leistung !!" Ich konnte nur antworten.

Dieses Mal habe ich versucht zu überprüfen, warum StringBuilder eine gute Leistung hat und wie groß der Geschwindigkeitsunterschied ist.

Anderer Ort

StringBuilder: Nicht threadsicher StringBuffer: Thread-sicher

Das war alles. Laut Tiger, der StringBuilder eingeführt hat "Benötigen Sie einen Thread-Safe für die Verkettung von Zeichenfolgen?" Es scheint, dass es mit der Idee gemacht wurde.

String Manipulation Thread Safe vs Performance StringBuilder

Sicherlich habe ich noch nie eine String-Verkettung gesehen, die Thread-Sicherheit erfordert. Viele Leute haben es ohne große Sorge benutzt, aber ich finde es erstaunlich, es zu fangen.

Überprüfung

Ich habe versucht, es leicht zu überprüfen. Wir haben diese Überprüfungsmethode übernommen. [Java] Ich habe versucht, den Unterschied zwischen StringBuilder und StringBuffer unter dem Gesichtspunkt der Thread-Sicherheit zu überprüfen

Teilen Sie dieselbe StringBuilder / StringBuffer-Instanz mit 100 Threads und wiederholen Sie das Anhängen 10.000 Mal. Infolgedessen sehen wir, ob length () korrekt 1 Million beträgt. Die Verarbeitungsgeschwindigkeit wurde ebenfalls gemessen.

StringBuilderTest.java


public class StringBuilderTest {
  
	public static void main (String... args) throws InterruptedException {
		ExecutorService executor = Executors.newFixedThreadPool(100);
		StringBuilder sb = new StringBuilder();
		List<BuilderTask> taskList = new ArrayList<BuilderTask>();
		
		for(int i = 0; i < 100; i++) {
			taskList.add(new BuilderTask(sb));
		}
		
		Long start = System.currentTimeMillis();
		
		executor.invokeAll(taskList);
		
		System.out.println("-----StringBuilder-----");
		System.out.println("TAT : " + (System.currentTimeMillis() - start));
		System.out.println("length() : " + sb.length());
	}
	
	static class BuilderTask implements Callable<Integer> {
		private StringBuilder sb;
		
		public BuilderTask(StringBuilder sb) {
			this.sb = sb;
		}

		@Override
		public Integer call() throws Exception {
			for(int i = 0; i < 10000; i++) {
				sb.append("#");				
			}
			return null;
		}
	}
}

StringBufferTest.java


public class StringBufferTest {
  
	public static void main (String... args) throws InterruptedException {
		ExecutorService executor = Executors.newFixedThreadPool(100);
		StringBuffer sb = new StringBuffer();
		List<BufferTask> taskList = new ArrayList<BufferTask>();
		
		for(int i = 0; i < 100; i++) {
			taskList.add(new BufferTask(sb));
		}
		
		Long start = System.currentTimeMillis();
		
		executor.invokeAll(taskList);
		
		System.out.println("-----StringBuffer-----");
		System.out.println("TAT : " + (System.currentTimeMillis() - start));
		System.out.println("length() : " + sb.length());
	}
	
	static class BufferTask implements Callable<Integer> {
		private StringBuffer sb;
		
		public BufferTask(StringBuffer sb) {
			this.sb = sb;
		}

		@Override
		public Integer call() throws Exception {
			for(int i = 0; i < 10000; i++) {
				sb.append("#");				
			}
			return null;
		}
	}
}

Ergebnis

-----StringBuilder-----
TAT : 32
length() : 542861

-----StringBuffer-----
TAT : 157
length() : 1000000

Mit StringBuilder ging fast die Hälfte der Zeichen verloren. Stattdessen ist die Verarbeitungsgeschwindigkeit etwa fünfmal schneller.

Es ist immer noch unwahrscheinlich, dass ich im realen Geschäft eine thread-sichere String-Verkettung benötige. Daher werde ich StringBuilder mit Schwerpunkt auf Leistung verwenden.

Recommended Posts

Unterschied zwischen StringBuilder und StringBuffer
[Java] Unterschied zwischen StringBuffer und StringBuilder
Unterschied zwischen vh und%
Unterschied zwischen i ++ und ++ i
Unterschied zwischen Produkt und Variante
Unterschied zwischen redirect_to und render
[Java] Unterschied zwischen == und gleich
Unterschied zwischen redirect_to und render
Unterschied zwischen CUI und GUI
Unterschied zwischen Variablen und Instanzvariablen
Unterschied zwischen Mockito-Core und Mockito-All
Unterschied zwischen Klasse und Instanz
Unterschied zwischen Bundle und Bundle-Installation
Unterschied zwischen ArrayList und LinkedList
Unterschied zwischen render und redirect_to
Unterschied zwischen List und ArrayList
Unterschied zwischen render und redirect_to
[Ruby] Unterschied zwischen get und post
Unterschied zwischen Instanzmethode und Klassenmethode
Unterschied zwischen Schnittstelle und abstrakter Klasse
Unterschied zwischen == Operator und Methode gleich
[Java] Unterschied zwischen Hashmap und HashTable
[Terminal] Unterschied zwischen irb und pry
JavaServlet: Unterschied zwischen executeQuery und executeUpdate
[Ruby] Unterschied zwischen is_a? Und instance_of?
Unterschied zwischen dem Operator == und der Methode eqals
Grober Unterschied zwischen RSpec und Minitest
[Rails] Unterschied zwischen find und find_by
Unterschied zwischen Instanzvariable und Klassenvariable
StringBuffer- und StringBuilder-Klasse in Java
[JAVA] Unterschied zwischen Abstract und Interface
Unterschied zwischen Thymeleaf @RestController und @Controller
[Java] Unterschied zwischen Array und ArrayList
Unterschied zwischen primitivem Typ und Referenztyp
[Java] Unterschied zwischen Closeable und AutoCloseable
[Java] Unterschied zwischen Länge, Länge () und Größe ()
[Rails] Unterschied zwischen redirect_to und Rendern
[Android] Unterschied zwischen finish () und return;
Hinweis: Unterschied zwischen Ruby "p" und "Puts"
Unterschied zwischen final und Immutable in Java
[Hinweis] Unterschied zwischen Bundle-Installation und -Update
Unterschied zwischen Ruby-Instanzvariable und lokaler Variable
Unterschied zwischen pop () und peek () im Stapel
[Für Anfänger] Unterschied zwischen Java und Kotlin
Unterschied zwischen isEmpty und isBlank von StringUtils
Unterschied zwischen getText () und getAttribute () von Selen
Über den Unterschied zwischen irb und pry
Unterschied zwischen "|| =" und "instance_variable_defined?" Im Ruby-Memo
Unterschied zwischen EMPTY_ELEMENTDATA und DEFAULTCAPACITY_EMPTY_ELEMENTDATA in ArrayList
[Java] Unterschied zwischen Intstream-Bereich und rangeClosed
Unterschied zwischen int und Integer in Java
[Rails] Unterschied zwischen redirect_to und render [Anfänger]
[Java] Verstehe den Unterschied zwischen List und Set
[iOS] Verstehe den Unterschied zwischen Frame und Grenzen
Unterschied zwischen next () und nextLine () in Java Scanner