Les objets StringBuffer sont des chaînes de caractères mutables, c'est-à-dire, dont la taille et le contenu peuvent être modifiés dynamiquement.

Dans le cas des objets StringBuffer, il est nécessaire de créer des instances de la classe StringBuffer par le biais de l'opérateur new.

StringBuffer chaine = new StringBuffer("Chaîne initiale");

Ainsi contrairement aux objets String, il devient possible de supprimer, d'ajouter, d'insérer ou de remplacer de nouvelles données directement dans la chaîne de caractères d'origine par l'intermédiaire de méthodes spécialisées telles que respectivement delete(), append(), insert() ou replace().

class TestStringBuffer {
  public static void main(String args[]) {
    StringBuffer ch = new StringBuffer();
    System.out.println("Capacite : " + ch.capacity());
    ch = ch.append("Confucius :\n");
    ch = ch.append("Quand on est capable d'accomplir la justice,"
                                  + " il faut tenir sa parole.");
    System.out.println (ch);
    System.out.println("Capacite : " + ch.capacity());
    ch = ch.insert(ch.indexOf("la justice"), 
                                   "sa promesse sans manquer a ");
    System.out.println (ch);
    System.out.println("Capacite : " + ch.capacity());
    ch = ch.replace(ch.indexOf("on ")
                                  + "on ".length(), ch.indexOf("accomplir"), "peut ");
    System.out.println (ch);
    System.out.println("Capacite : " + ch.capacity());
  }
}

La méthode toString() est appelée implicitement lors d'une tentative d'affichage de l'objet StringBuffer. Ainsi dans ce cas, on peut se passer de l'écriture ci-dessous :

System.out.println(ch.toString());

A partir de cet objet, des méthodes diverses peuvent être appliquées afin de consulter ou de modifier l'état de l'objet.

import specialIO.*;
/**
* Cette application permet de crypter et de décrypter
* une chaine de caractères à l'aide de l'algorithme de César
*/
class CryptageChaine { static public String chaine; static public StringBuffer copieChaine; static public int ecart = 1; /**
* Cette méthode permet d'exécuter le programme et
* de lancer une saisie de l'opérateur puis de crypter
* et de décrypter une chaîne de caractères.
*/
public static void main(String args[]) { System.out.print ("Veuillez saisir une chaine de caracteres : "); chaine = Console.in.readLine(); copieChaine = new StringBuffer(chaine); System.out.println ("*** CRYPTAGE ***"); cryptage(); System.out.println ("*** DECRYPTAGE ***"); decryptage(); } /**
* Cette méthode permet de crypter une chaîne de caractères.
*/
public static void cryptage(){ for(int i = 0; i < chaine.length(); i++){ char car = chaine.charAt(i); if(car > (char)('z'-ecart)) copieChaine.replace(i, i+1, ecart == 1 ? "a" : "" +(char)('a'+ecart-1)); else if(chaine.charAt(i) == ' ') copieChaine.replace(i, i+1, "$"); else copieChaine.replace(i, i+1, ""+(char)(car+ecart)); } System.out.println("Chaine d'origine : " + chaine); System.out.println("Chaine cryptee : " + copieChaine); } /**
* Cette méthode permet de décrypter une chaîne de caractères.
*/
public static void decryptage(){ for(int i = 0; i < copieChaine.length(); i++){ char car = copieChaine.charAt(i); if(car < (char)('a'+ecart)) copieChaine.replace(i, i+1, ecart == 1 ? "z" : "" +(char)('z'-ecart-1)); else if(copieChaine.charAt(i) == '$') copieChaine.replace(i, i+1, " "); else copieChaine.replace(i, i+1, ""+(char)(car-ecart)); } System.out.println("Chaine d'origine : " + chaine); System.out.println("Chaine decryptee : " + copieChaine); } }

Un objet StringBuffer n'est pas directement compatible avec son homologue String. La conversion de l'une vers l'autre et réciproquement contraint à utiliser :

  • le constructeur StringBuffer() avec comme argument une chaîne de caractères,
    String ch = "Une chaîne quelconque !";
    StringBuffer chb = new StringBuffer(ch);
  • la méthode tostring() de l'objet StringBuffer retournant une chaîne de caractères.
    StringBuffer chb = new StringBuffer("Une chaîne quelconque !");
    String ch = chb.toString();

Les objets StringBuffer sont utilisés par le compilateur pour implémenter l'opérateur de concaténation '+'.

String ch1 = "La Justice";
String ch2 = "vitesses";
String resultat = ch1 + "fonctionne à deux " + ch2 + " !";
// Compilation
String resultat = new StringBuffer().append(ch1)
                                .append("fonctionne à deux ")
                                .append(ch2).append(" !").toString();

Une nouvelle instance vide de la classe StringBuffer est créée, puis chaque chaîne de caractères de l'expression initiale est ajoutée à l'objet, par le biais des méthodes append() et enfin la méthode toString() se charge de retourner un objet String conforme au type de l'expression.

Tant que la longueur d'une séquence de caractères contenue dans l'objet StringBuffer n'excède pas la capacité initiale, il n'est pas nécessaire d'allouer de nouvelles ressources à l'objet. Par contre, lorsque la mémoire tampon interne de l'objet ne suffit plus, alors de nouvelles ressources systèmes nécessaires sont allouées automatiquement à l'objet.