87 votes

Pourquoi StringBuilder quand il y a String?

Je viens de rencontrer StringBuilder pour la première fois et suis surpris car Java possède déjà une classe String très puissante qui permet d’ajouter des éléments.

Pourquoi une deuxième classe String ?

Où puis-je en savoir plus sur StringBuilder ?

176voto

Bozho Points 273663

String ne permet pas l'ajout. Chaque méthode vous appeler sur un String crée un nouvel objet et le renvoie. C'est parce qu' String est immuable, qui ne peut pas changer son état interne.

D'autre part StringBuilder est mutable. Lorsque vous appelez append(..) il modifie l'interne char tableau, plutôt que de créer un nouvel objet de type string.

Il est donc plus efficace d'avoir:

StringBuilder sb = new StringBuilder();
for (int i = 0; i < 500; i ++) {
    sb.append(i);
}

plutôt que d' str += i, ce qui permettrait de créer 500 nouveaux objets string.

Notez que dans l'exemple, j'utilise une boucle. Comme helios notes dans les commentaires, le compilateur traduit automatiquement des expressions comme String d = a + b + c à quelque chose comme

String d = new StringBuilder(a).append(b).append(c).toString();

Notez également qu'il n'y est StringBuffer de plus de StringBuilder. La différence est que le premier est synchronisé méthodes. Si vous l'utilisez comme une variable locale, utilisez StringBuilder. S'il arrive que c'est possible pour qu'il soit accessible par plusieurs threads, utilisez StringBuffer (c'est rare)

64voto

Amir Raminfar Points 17939

Voici un exemple concret expliquant pourquoi -

 int total = 50000;
String s = ""; 
for (int i = 0; i < total; i++) { s += String.valueOf(i); } 
// 4828ms

StringBuilder sb = new StringBuilder(); 
for (int i = 0; i < total; i++) { sb.append(String.valueOf(i)); } 
// 4ms
 

Comme vous pouvez le constater, la différence de performance est significative.

19voto

user449355 Points 4512

La classe String est immuable, alors que StringBuilder est modifiable.

 String s = "Hello";
s = s + "World";
 

Le code ci-dessus créera deux objets car String est immuable

 StringBuilder sb = new StringBuilder("Hello");
sb.append("World");
 

Le code ci-dessus ne créera qu'un seul objet car StringBuilder n'est pas immuable.

Leçon: Chaque fois qu'il est nécessaire de manipuler / mettre à jour / ajouter String, StringBuilder est considéré comme efficace par rapport à String.

8voto

Rex M Points 80372

StringBuilder est pour, ainsi, la construction de chaînes de caractères. Plus précisément, la construction dans un très performantes moyen. La classe String est bon pour beaucoup de choses, mais en fait elle a vraiment terrible de la performance lors de l'assemblage d'une nouvelle chaîne de plus petites parties de chaîne de car chaque nouvelle chaîne est un fait totalement nouveau, réaffectées en chaîne. (C'est immuable) StringBuilder conserve la même séquence en place et le modifie (mutable).

3voto

Thomas Points 63635

De l'efficacité.

Chaque fois que vous concaténer des chaînes, une nouvelle chaîne sera créé. Par exemple:

String out = "a" + "b" + "c";

Cela crée une nouvelle chaîne temporaire, des copies "a" et "b" dans le il traduire par "ab". Il crée ensuite une autre nouvelle, chaîne temporaire, des copies "ab" et "c" dans ce, pour un résultat "abc". Ce résultat est ensuite affecté à l' out.

Le résultat est un Schlemiel l'algorithme du Peintre de O(n2) (quadratique) le temps de la complexité.

StringBuilder, d'autre part, vous permet d'ajouter des cordes en place, le redimensionnement de la chaîne de sortie si nécessaire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X