[JAVA] Différence entre StringBuilder et StringBuffer

Au début

"Veuillez expliquer la différence entre StringBuilder et StringBuffer." M'a dit, "String Builder a de meilleures performances !!" Je ne pouvais que répondre.

Donc, cette fois, j'ai essayé de vérifier pourquoi StringBuilder a de bonnes performances et quelle est la différence de vitesse.

Endroit différent

StringBuilder: non thread-safe StringBuffer: thread safe

C'était tout. Selon Tiger, qui a introduit StringBuilder, "Avez-vous besoin de thread safe pour la concaténation de chaînes?" Il semble que cela ait été fait avec l'idée.

String Manipulation Thread Safe vs Performance StringBuilder

Certes, je n'ai jamais vu une concaténation de chaînes qui nécessite la sécurité des threads. Beaucoup de gens l'ont utilisé sans trop s'inquiéter, mais je pense que c'est incroyable de l'attraper.

Vérification

J'ai essayé de le vérifier facilement. Nous avons adopté cette méthode de vérification. [Java] J'ai essayé de vérifier la différence entre StringBuilder et StringBuffer du point de vue de la sécurité des threads

Partagez la même instance StringBuilder / StringBuffer avec 100 threads et répétez l'ajout 10 000 fois. En conséquence, nous voyons si length () est correctement 1 million. La vitesse de traitement a également été mesurée.

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;
		}
	}
}

résultat

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

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

Avec StringBuilder, près de la moitié des personnages ont été perdus. Au lieu de cela, la vitesse de traitement est environ 5 fois plus rapide.

Il est peu probable que j'aie besoin d'une concaténation de chaînes thread-safe dans les affaires réelles, donc je pense que j'utiliserai StringBuilder en mettant l'accent sur les performances.

Recommended Posts

Différence entre StringBuilder et StringBuffer
[Java] Différence entre StringBuffer et StringBuilder
Différence entre vh et%
Différence entre i ++ et ++ i
Différence entre produit et variante
Différence entre redirect_to et render
[Java] Différence entre == et égal
Différence entre redirect_to et render
Différence entre CUI et GUI
Différence entre les variables et les variables d'instance
Différence entre mockito-core et mockito-all
Différence entre classe et instance
Différence entre l'installation de bundle et de bundle
Différence entre ArrayList et LinkedList
Différence entre render et redirect_to
Différence entre List et ArrayList
Différence entre render et redirect_to
[Ruby] Différence entre obtenir et publier
Différence entre la méthode d'instance et la méthode de classe
Différence entre interface et classe abstraite
Différence entre l'opérateur == et la méthode égale
[Java] Différence entre Hashmap et HashTable
[Terminal] Différence entre irb et pry
JavaServlet: différence entre executeQuery et executeUpdate
[Ruby] Différence entre is_a? Et instance_of?
Différence entre l'opérateur == et la méthode eqals
Différence approximative entre RSpec et minitest
[Rails] Différence entre find et find_by
Différence entre la variable d'instance et la variable de classe
Classe StringBuffer et StringBuilder en Java
[JAVA] Différence entre abstrait et interface
Différence entre Thymeleaf @RestController et @Controller
[Java] Différence entre array et ArrayList
Différence entre le type primitif et le type de référence
[Java] Différence entre fermable et fermable automatiquement
[Java] Différence entre longueur, longueur () et taille ()
[rails] Différence entre redirect_to et render
[Android] Différence entre finish () et return;
Remarque: Différence entre Ruby "p" et "met"
Différence entre final et immuable en Java
[Remarque] Différence entre l'installation et la mise à jour du bundle
Différence entre la variable d'instance Ruby et la variable locale
Différence entre pop () et peek () dans la pile
[Pour les débutants] Différence entre Java et Kotlin
Différence entre isEmpty et isBlank de StringUtils
Différence entre getText () et getAttribute () de Selenium
À propos de la différence entre irb et pry
Différence entre "|| =" et "instance_variable_defined?" Dans Ruby memo
Différence entre EMPTY_ELEMENTDATA et DEFAULTCAPACITY_EMPTY_ELEMENTDATA dans ArrayList
[Java] Différence entre la plage Intstream et la plageClosed
Différence entre int et Integer en Java
[Rails] Différence entre redirect_to et render [Débutant]
[Java] Comprendre la différence entre List et Set
[iOS] Comprendre la différence entre le cadre et les limites
Différence entre next () et nextLine () dans Java Scanner