Participer au site avec un Tip
Rechercher
 

Améliorations / Corrections

Vous avez des améliorations (ou des corrections) à proposer pour ce document : je vous remerçie par avance de m'en faire part, cela m'aide à améliorer le site.

Emplacement :

Description des améliorations :

Module : java.base - Package : java.lang
Version documentée : Java SE 17

Classe « StringBuilder »

Informations générales

Héritage

java.lang.Object
    java.lang.AbstractStringBuilder
        java.lang.StringBuilder

Interfaces implémentées

java.io.Serializable
java.lang.CharSequence
java.lang.Comparable<java.lang.StringBuilder>

Définition

public final class StringBuilder extends java.lang.AbstractStringBuilder
implements java.io.Serializable,
java.lang.CharSequence,
java.lang.Comparable<java.lang.StringBuilder>

Description

Cette classe permet de produire une chaîne de caractères nécessitant d'agréger une grande quantité d'informations.

Concaténer des chaînes de caractères (via les opérateurs + ou +=) dans des boucles peut s'avérer très couteûx en temps. De nombreux objets temporaires (de type String) sont produits, ce qui fait forcer le garbage collector, et les recopies des caractères d'une chaîne à l'autre vont être nombreuses et couteûses. Plutôt que d'utiliser des concaténations, il vous est suggéré d'utiliser un StringBuilder qui permet de limiter les allocations mémoire et les recopies de chaînes. Une fois toutes les informations injectées dans votre builder, vous pourrez produire la chaîne finale en invoquant la méthode toString.

contrairement à une instance de String qui, je le rappelle, est non modifiable, une instance de type StringBuilder peut être modifiée à tout moment.

Comme son nom l'indique, la classe implémente le « design pattern Builder ». Dit autrement, les méthodes d'enrichissements de la chaîne à produire renvoit systématiquement le builder en cours d'utilisation. Il est donc possible d'enchaîner les appels de méthodes comme le montre l'exemple suivant.

 1 
 2 
 3 
 4 
 5 
 6 
 7 
// On peut enchaîner les appels de méthodes
builder.append( "Début" ).append( numericData ).append( "Fin" );

// La ligne précédente est équivalente à :
builder.append( "Début" );
builder.append( numericData );
builder.append( "Fin" );
On peut enchaîner les traitements
la classe StringBuilder n'est pas « thread safe ». Si plusieurs threads travaillent simultanément sur une même instance de StringBuilder, le résultat final sera non prévisible. Si vous travaillez dans un environnement multi-threads, il vous est conseillé de privilégier l'utilisation de la classe StringBuffer qui, elle, est thread safe.

Exemple de code

Voici un exemple d'utilisation de la classe StringBuilder : on y produit le code HTML d'un tableau constitué de plusieurs lignes et de plusieurs cellules de données. Un comparatif, en termes de temps d'exécution, y est réalisé avec des concaténations plus classiques.

 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
 10 
 11 
 12 
 13 
 14 
 15 
 16 
 17 
 18 
 19 
 20 
 21 
 22 
 23 
 24 
 25 
 26 
 27 
 28 
 29 
 30 
 31 
 32 
 33 
 34 
 35 
 36 
 37 
 38 
 39 
 40 
 41 
 42 
 43 
 44 
 45 
 46 
 47 
 48 
 49 
 50 
 51 
 52 
 53 
 54 
 55 
 56 
 57 
 58 
 59 
 60 
 61 
 62 
 63 
import java.io.File;
import java.io.IOException;
import java.text.DateFormat;
import java.util.Date;

public class HtmlGenerator {    
    
    private static final int LOOP_COUNT = 2000;
    
    // On génère le code HTML d'un tableau avec des concaténations.
    public static String simpleGeneration() {
        String temp = "<table class='sample'>";
        
        for( int rowIndex=0; rowIndex<10; rowIndex++ ) {
            temp += "<tr>";
            for( int columnIndex=0; columnIndex<10; columnIndex++ ) {
                temp += "<td>Cell " + columnIndex + "x" + rowIndex + "</td>";
            }
            temp += "</tr>";
        }
        
        temp += "</table>";
        return temp;        
    }

    // On génère le code HTML d'un tableau avec un StringBuilder.
    public static String optimizedGeneration() {
        StringBuilder temp = new StringBuilder( "<table class='sample'>" );
        
        for( int rowIndex=0; rowIndex<10; rowIndex++ ) {
            temp.append( "<tr>" );
            for( int columnIndex=0; columnIndex<10; columnIndex++ ) {
                temp.append( "<td>Cell " );
                temp.append( columnIndex ).append( "x" ).append( rowIndex );
                temp.append( "</td>" );
            }
            temp.append( "</tr>" );
        }
        
        temp.append( "</table>" );
        return temp.toString();     
    }

    // On compare les deux approches pour voir laquelle est la plus performante.
    public static void main(String[] args) {
        
        long begin = System.currentTimeMillis();
        for( int i=0; i<LOOP_COUNT; i++ ) {
            HtmlGenerator.simpleGeneration();
        }
        long end = System.currentTimeMillis();
        System.out.println( "Simple generation time " + (end-begin) + "ms" );

        
        begin = System.currentTimeMillis();
        for( int i=0; i<LOOP_COUNT; i++ ) {
            HtmlGenerator.optimizedGeneration();
        }
        end = System.currentTimeMillis();
        System.out.println( "Optimized generation time " + (end-begin) + "ms" );
    
    }
}
Exemple d'utilisation d'un StringBuilder

Et voici les résultats produit sur mon PC : les temps peuvent changer en fonction de la puissance de calcul de votre machine, mais dans tous les cas, l'approche utilisant un StringBuilder sera plus efficace.

Simple generation time 229ms
Optimized generation time 15ms

Disponible depuis

5.0

Voir aussi

La classe String
La classe StringBuffer

Liste des attributs

Tous les attributs Attributs d'instance Attributs statiques Attributs dépréciés
QualificateursTypeNomDescription

Liste des constructeurs

Constructeurs Constructeurs dépréciés
ConstructeurDescription
StringBuilder()
StringBuilder( CharSequence seq )
StringBuilder( String str )
StringBuilder( int capacity )

Liste des propriétés (getters/setters)

Propriétés Propriétés dépréciées
QualificateursTypeNomR/W
public int length -/W

Propriétés héritées de la classe java.lang.AbstractStringBuilder

length

Propriétés héritées de la classe java.lang.Object

class

Liste des méthodes

Toutes les méthodes Méthodes d'instance Méthodes statiques Méthodes concrètes Méthodes abstraites Méthodes dépréciées
QualificateursType de retourPrototype de la méthodeDescription
public StringBuilder append( CharSequence s, int start, int end )
public StringBuilder append( char[] str )
public StringBuilder append( char[] str, int offset, int len )
public StringBuilder append( boolean b )
public StringBuilder append( CharSequence s )
public StringBuilder append( StringBuffer sb )
public StringBuilder append( String str )
public StringBuilder append( float f )
public StringBuilder append( double d )
public StringBuilder append( Object obj )
public StringBuilder append( char c )
public StringBuilder append( int i )
public StringBuilder append( long lng )
public StringBuilder appendCodePoint( int codePoint )
public int compareTo( StringBuilder another )
public StringBuilder delete( int start, int end )
public StringBuilder deleteCharAt( int index )
public int indexOf( String str )
public int indexOf( String str, int fromIndex )
public StringBuilder insert( int offset, float f )
public StringBuilder insert( int offset, long l )
public StringBuilder insert( int offset, int i )
public StringBuilder insert( int index, char[] str, int offset, int len )
public StringBuilder insert( int dstOffset, CharSequence s, int start, int end )
public StringBuilder insert( int dstOffset, CharSequence s )
public StringBuilder insert( int offset, char[] str )
public StringBuilder insert( int offset, String str )
public StringBuilder insert( int offset, boolean b )
public StringBuilder insert( int offset, char c )
public StringBuilder insert( int offset, Object obj )
public StringBuilder insert( int offset, double d )
public int lastIndexOf( String str, int fromIndex )
public int lastIndexOf( String str )
public StringBuilder replace( int start, int end, String str )
public StringBuilder reverse()
public String toString()

Méthodes héritées de la classe java.lang.AbstractStringBuilder

append, append, append, append, append, append, append, append, append, append, append, append, append, appendCodePoint, capacity, charAt, chars, codePointAt, codePointBefore, codePointCount, codePoints, delete, deleteCharAt, ensureCapacity, getChars, indexOf, indexOf, insert, insert, insert, insert, insert, insert, insert, insert, insert, insert, insert, insert, lastIndexOf, lastIndexOf, length, offsetByCodePoints, replace, reverse, setCharAt, setLength, subSequence, substring, substring, toString, trimToSize

Méthodes héritées de la classe java.lang.Object

clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait