Optimiser ses chaines de caractères

Connaissez vous la différence entre StringBuilder, StringBuffer et String ?

Tous ces objets contiennent des chaines de caractères mais les traitent différemment. En choisissant bien la classe à utiliser, on peut grandement accélérer son code.

Différences Entre String et StringBuffer

L’objet String est immuable.

Modifier une chaine de caractères en utilisant String provoquera de multiples créations d’objets. Et comme vous vous en doutez, la création et la destruction d’objet consomme les ressources du système…

String s = "Je t'aime, "
String result = s;
    for (int i=1; i < 100; i++) {
        result = result + s;
    }
    return result;

Ce code créera 102 objets String.

Maintenant utilisons StringBuffer

   String s = "Je t'aime, "
   StringBuffer result = new StringBuffer(s);
    for (int i=1; i < 100; i++) {
        result.append(s);
    }
    return result.toString();

Seul 3 objets String seront créés, quelque soit le nombre d’itérations…

Vous pourriez accélérer encore plus ce code StringBuffer en indiquant la capacité initiale de la chaine de caractère: StringBuffer result = new StringBuffer(s.lenght() * 100);

Et StringBuilder ?

StringBuilder est apparu avec Java 5. Il s’agit d’une classe similaire à StringBuffer au niveau de ses méthodes et des ses fnctions. La différence réside dans le fait que StringBuilder est plus rapide que StringBuffer

Pourquoi? Les méthodes de StringBuffer sont synchronized: – c’est à dire Thread safe – alors que celles de StringBuilder ne le sont pas.

Optimisation Automatique

Le compilateur Java est toutefois capable d’optimiser automatiquement les chaines de caractères.

String a = "5 Fresh Minutes";
String b = " IT";
//Autres instructions...
String s = "a + b = " + a + b;

serait traduit par

String a = "5 Fresh Minutes";
String b = " IT";
//Autres instructions...
StringBuffer sbuf = new StringBuffer(32);
sbuf.append("a + b = ").append(a).append(b);
String s = sbuf.toString();

Quelle Classe utiliser ?

  1. Utilisez String, pour les chaines de caractères fixes.
  2. Si le texte est sujet à diverses modifications et se place dans un contexte mono thread, utilisez la classe StringBuilder
  3. Si le texte est sujet à diverses modifications et se place dans un contexte multi thread, utilisez la classe StringBuffer

A lire:

Sources: