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
Liste des constructeurs
Constructeurs
Constructeurs dépréciés
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
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
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
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 :