Chaîne vs StringBuffer vs StringBuilder

La classe String est l’une des classes les plus largement utilisées en Java. Les classes StringBuffer et StringBuilder fournissent des méthodes pour manipuler les chaînes de caractères. Nous examinerons la différence entre StringBuffer et StringBuilder. StringBuffer vs StringBuilder est une question populaire lors des entretiens Java.

String vs StringBuffer vs StringBuilder

La chaîne de caractères est l’un des sujets les plus importants lors des entretiens Java de base. Si vous écrivez un programme qui imprime quelque chose sur la console, vous utilisez String. Ce tutoriel vise à se concentrer sur les principales fonctionnalités de la classe String. Ensuite, nous comparerons les classes StringBuffer et StringBuilder.

String en Java

  1. La classe String représente des chaînes de caractères, que l’on peut instancier de deux manières.

    String str = "ABC";
    // ou 
    String str = new String("ABC");
    
  2. String est immuable en Java. Ainsi, elle est adaptée à une utilisation dans un environnement multi-thread. On peut la partager entre les fonctions sans crainte d’incohérence des données.

  3. Lorsque nous créons une chaîne de caractères en utilisant des guillemets doubles, la JVM recherche d’abord une chaîne de caractères ayant la même valeur dans le pool de chaînes. Si elle est trouvée, elle renvoie la référence de l’objet de chaîne à partir du pool. Sinon, elle crée l’objet de chaîne dans le pool de chaînes et renvoie la référence. La JVM économise beaucoup de mémoire en utilisant la même chaîne de caractères dans différents threads.

  4. Si l’opérateur « new » est utilisé pour créer une chaîne de caractères, elle est créée dans la mémoire de la tas.

  5. L’opérateur « + » est surchargé pour les chaînes de caractères. Nous pouvons l’utiliser pour concaténer deux chaînes de caractères. Bien qu’en interne, il utilise StringBuffer pour effectuer cette action.

  6. La chaîne de caractères remplace les méthodes equals() et hashCode(). Deux chaînes sont égales seulement si elles ont la même séquence de caractères. La méthode equals() est sensible à la casse. Si vous recherchez des vérifications insensibles à la casse, vous devriez utiliser la méthode equalsIgnoreCase().

  7. La chaîne utilise le codage UTF-16 pour le flux de caractères.

  8. String est une classe finale. Tous les champs sont finaux, sauf « private int hash ». Ce champ contient la valeur de la fonction hashCode(). La valeur de hashcode n’est calculée que lorsque la méthode hashCode() est appelée pour la première fois, puis mise en cache dans ce champ. De plus, le hash est généré en utilisant les champs finaux de la classe String avec certains calculs. Ainsi, chaque fois que la méthode hashCode() est appelée, elle donnera le même résultat. Pour l’appelant, cela semble être des calculs à chaque fois, mais en interne, c’est mis en cache dans le champ de hash.

String vs StringBuffer

Étant donné que la chaîne de caractères est immuable en Java, chaque fois que nous effectuons une manipulation de chaîne de caractères comme la concaténation, la sous-chaîne, etc., cela génère une nouvelle chaîne de caractères et supprime l’ancienne chaîne de caractères pour la collecte des ordures. Ce sont des opérations lourdes et génèrent beaucoup de déchets dans le tas. C’est pourquoi Java a fourni les classes StringBuffer et StringBuilder qui doivent être utilisées pour la manipulation de chaînes de caractères. StringBuffer et StringBuilder sont des objets mutables en Java. Ils fournissent des méthodes append(), insert(), delete() et substring() pour la manipulation de chaînes de caractères.

StringBuffer vs StringBuilder

StringBuffer était le seul choix pour la manipulation de chaînes de caractères jusqu’à Java 1.4. Mais il a un inconvénient: toutes ses méthodes publiques sont synchronisées. StringBuffer assure la sécurité des threads mais avec un coût en performance. Dans la plupart des cas, nous n’utilisons pas les chaînes de caractères dans un environnement multithread. C’est pourquoi Java 1.5 a introduit une nouvelle classe, StringBuilder, similaire à StringBuffer à l’exception de la sécurité des threads et de la synchronisation. StringBuffer possède quelques méthodes supplémentaires telles que substring, length, capacity, trimToSize, etc. Cependant, elles ne sont pas nécessaires car vous les avez toutes présentes dans String également. C’est pourquoi ces méthodes n’ont jamais été implémentées dans la classe StringBuilder. StringBuffer a été introduit en Java 1.0 tandis que la classe StringBuilder a été introduite en Java 1.5 après avoir examiné les lacunes de StringBuffer. Si vous êtes dans un environnement à thread unique ou que vous ne vous souciez pas de la sécurité des threads, vous devriez utiliser StringBuilder. Sinon, utilisez StringBuffer pour les opérations sûres sur les threads.

Performance de StringBuilder vs StringBuffer

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

Il est clair que StringBuilder est plus performant que StringBuffer même dans le cas d’un environnement à thread unique. Cette différence de performance peut être due à la synchronisation dans les méthodes StringBuffer.

String vs StringBuffer vs StringBuilder

  1. String est immuable tandis que StringBuffer et StringBuilder sont des classes mutables.
  2. StringBuffer est sûr pour les threads et synchronisé, tandis que StringBuilder ne l’est pas. C’est pourquoi StringBuilder est plus rapide que StringBuffer.
  3. L’opérateur de concaténation de chaînes (+) utilise internement la classe StringBuffer ou StringBuilder.
  4. Pour les manipulations de chaînes dans un environnement non multi-threadé, nous devrions utiliser StringBuilder, sinon utiliser la classe StringBuffer.

C’est tout pour un tour d’horizon rapide des différences entre String, StringBuffer et StringBuilder. StringBuilder est mieux adapté que StringBuffer dans la plupart des scénarios de programmation générale. Références :

Source:
https://www.digitalocean.com/community/tutorials/string-vs-stringbuffer-vs-stringbuilder