Question Comment puis-je effacer ou vider un StringBuilder? [dupliquer]


Cette question a déjà une réponse ici:

J'utilise un StringBuilder dans une boucle et toutes les itérations x je veux le vider et commencer par un vide StringBuilder, mais je ne vois pas de méthode similaire au .NET StringBuilder.Clear dans la documentation, juste le effacer méthode qui semble trop compliquée.

Alors, quelle est la meilleure façon de nettoyer un StringBuilder en Java?


482
2018-03-04 10:26


origine


Réponses:


Deux façons qui fonctionnent:

  1. Utilisation stringBuilderObj.setLength(0).
  2. Attribuez-en un nouveau avec new StringBuilder() au lieu d'effacer le tampon.

548
2018-03-04 10:29



Il existe essentiellement deux alternatives, en utilisant setLength(0) pour réinitialiser StringBuilder ou en créer un nouveau à chaque itération. Les deux peuvent avoir des avantages et des inconvénients en fonction de l'utilisation.

Si vous connaissez la capacité attendue de StringBuilder au préalable, en créer une à chaque fois devrait être aussi rapide que de définir une nouvelle longueur. Cela aidera également le ramasse-miettes, puisque chaque StringBuilder aura une durée de vie relativement courte et que le gc sera optimisé pour cela.

Lorsque vous ne connaissez pas la capacité, réutiliser le même StringBuilder peut être plus rapide. Chaque fois que vous dépassez la capacité lors de l'ajout, une nouvelle matrice de sauvegarde doit être allouée et le contenu précédent doit être copié. En réutilisant le même StringBuilder, il atteindra la capacité requise après quelques itérations et il n'y aura plus de copie par la suite.


270
2018-03-04 11:26



delete n'est pas trop compliqué:

myStringBuilder.delete(0, myStringBuilder.length());

Vous pouvez aussi faire:

myStringBuilder.setLength(0);

67
2018-03-04 10:30



Si vous examinez le code source d'un StringBuilder ou d'un StringBuffer, l'appel setLength () réinitialise simplement une valeur d'index pour le tableau de caractères. IMHO utilisant la méthode setLength sera toujours plus rapide qu'une nouvelle allocation. Ils auraient dû nommer la méthode 'clear' ou 'reset' pour que ce soit plus clair.


24
2017-09-20 16:42



Je voterai pour sb.setLength(0); non seulement parce que c'est un appel de fonction, mais car il ne copie pas le tableau dans un autre tableau comme sb.delete(0, builder.length());. Il suffit de remplir les caractères restants pour qu'ils soient à 0 et de définir la variable de longueur sur la nouvelle longueur.

Vous pouvez examiner leur implémentation pour valider mon point de vue. ici à setLength fonction et delete0 fonction.


13
2018-05-12 12:08



StringBuilder s = new StringBuilder();
s.append("a");
s.append("a");
// System.out.print(s); is return "aa"
s.delete(0, s.length());
System.out.print(s.length()); // is return 0

est le moyen facile.


4
2017-08-02 21:44



Tu devrais utiliser sb.delete(0, sb.length()) ou sb.setLength(0) et ne pas créer un nouveau StringBuilder ().

Voir ce post connexe pour la performance: Est-il préférable de réutiliser un StringBuilder en boucle?


3
2017-11-15 22:57



Je pense que beaucoup de réponses ici peuvent manquer une méthode de qualité incluse dans StringBuilder: .delete(int start, [int] end). Je sais que c'est une réponse tardive; Cependant, cela devrait être connu (et expliqué un peu plus en détail).

Disons que vous avez une table StringBuilder - que vous souhaitez modifier dynamiquement tout au long de votre programme (celle sur laquelle je travaille en ce moment, par exemple).

StringBuilder table = new StringBuilder();

Si vous parcourez la méthode et modifiez le contenu, utilisez le contenu, puis supprimez le contenu pour "nettoyer" le contenu. StringBuilderpour l'itération suivante, vous pouvez supprimer son contenu, par ex.

table.delete(int start, int end). 

start and end étant les indices des caractères que vous souhaitez supprimer. Vous ne connaissez pas la longueur en caractères et souhaitez supprimer le tout?

table.delete(0, table.length());

MAINTENANT, pour le botteur. StringBuilders, comme mentionné précédemment, prend beaucoup de temps en cas de modification fréquente (et peut entraîner des problèmes de sécurité en matière de threading); par conséquent, utilisez StringBuffer - pareil que StringBuilder (à quelques exceptions près) - si votre StringBuilder est utilisé dans le but d'interfaçage avec l'utilisateur.


2
2018-03-27 17:25



Si la performance est la principale préoccupation ... l'ironie (IMO) est le Java construit pour mettre en forme le texte qui va dans le tampon consomme beaucoup plus de temps sur le CPU que la collection alloc / realloc / garbage ... eh bien, peut-être pas le GC en fonction du nombre de builders que vous créez et supprimez.

Mais ajouter simplement une chaîne composée ("Hello World of" + 6E9 + "earthlings.") À la mémoire tampon risque de rendre toute la question sans conséquence.

Et, vraiment, si StringBuilder impliqué le contenu est complexe et long et plus long qu'un simple String str = "Hi"; (peu importe que Java utilise probablement un générateur en arrière-plan).

Personnellement, j'essaie de ne pas abuser du GC. Donc, si c'est quelque chose qui va être beaucoup utilisé dans un scénario de tir rapide - comme, par exemple, écrire des messages de sortie de débogage ... Je suppose juste le déclarer ailleurs et le mettre à zéro pour une réutilisation.

class MyLogger {
    StringBuilder strBldr = new StringBuilder(256);

    public LogMsg( String stuff ) {

        strBldr.setLength(0);

        // ... prepend status level
        strBldr.append("Info");
        // ... prepend timestamp
        strBldr.append(" " + getTimestamp());
        // ... user msg
        strBldr.append(":" + msg);

        log.write(strBldr.toString());
    }
}

2
2017-09-25 10:26