Effacer un tampon / générateur de chaîne après la boucle

Comment effacez-vous le tampon de chaîne dans Java après une boucle afin que la prochaine itération utilise un tampon de chaîne clair?

    Une option consiste à utiliser la méthode de suppression comme suit:

    SsortingngBuffer sb = new SsortingngBuffer(); for (int n = 0; n < 10; n++) { sb.append("a"); // This will clear the buffer sb.delete(0, sb.length()); } 

    Une autre option (plus propre) utilise setLength (int len) :

     sb.setLength(0); 

    Voir Javadoc pour plus d'informations:

    Le moyen le plus simple de réutiliser le SsortingngBuffer est d’utiliser la méthode setLength()

    public void setLength(int newLength)

    Vous pouvez avoir l’affaire comme

     SsortingngBuffer sb = new SsortingngBuffer("HelloWorld"); // after many iterations and manipulations sb.setLength(0); // reuse sb 

    Vous avez deux options:

    Soit utiliser:

     sb.setLength(0); // It will just discard the previous data, which will be garbage collected later. 

    Ou utiliser:

     sb.delete(0, sb.length()); // A bit slower as it is used to delete sub sequence. 

    REMARQUE

    Évitez de déclarer des objects SsortingngBuffer ou SsortingngBuilder dans la boucle sinon il créera de nouveaux objects à chaque itération. La création d’objects nécessite des ressources système, de l’espace et prend également du temps. Donc, pour un long terme, évitez de les déclarer dans une boucle si possible.

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

    Je suggère de créer un nouveau SsortingngBuffer (ou même mieux, SsortingngBuilder ) pour chaque itération. La différence de performance est vraiment négligeable, mais votre code sera plus court et plus simple.

     public void clear(SsortingngBuilder s) { s.setLength(0); } 

    Usage:

     SsortingngBuilder v = new SsortingngBuilder(); clear(v); 

    pour la lisibilité, je pense que c’est la meilleure solution.

    Déjà bonne réponse là-bas. Ajoutez simplement un résultat de test pour les différences de performances SsortingngBuffer et SsortingngBuild use new instance in loop ou utilisez setLength (0) en boucle.

    Le résumé est: Dans une grande boucle

    • SsortingngBuilder est beaucoup plus rapide que SsortingngBuffer
    • Créer une nouvelle instance de SsortingngBuilder en boucle n’a pas de différence avec setLength (0). (setLength (0) a un avantage très très minime par rapport à la création d’une nouvelle instance).
    • SsortingngBuffer est plus lent que SsortingngBuilder en créant une nouvelle instance en boucle
    • setLength (0) de SsortingngBuffer est extrêmement plus lent que la création d’une nouvelle instance en boucle.

    Test très simple (j’ai juste changé manuellement le code et fait des tests différents):

     public class SsortingngBuilderSpeed { public static final char ch[] = new char[]{'a','b','c','d','e','f','g','h','i'}; public static void main(Ssortingng a[]){ int loopTime = 99999999; long startTime = System.currentTimeMillis(); SsortingngBuilder sb = new SsortingngBuilder(); for(int i = 0 ; i < loopTime; i++){ for(char c : ch){ sb.append(c); } sb.setLength(0); } long endTime = System.currentTimeMillis(); System.out.println("Time cost: " + (endTime - startTime)); } 

    }

    Nouvelle instance de SsortingngBuilder en boucle: coût en temps: 3693, 3862, 3624, 3742

    SsortingngBuilder setLength: coût en temps: 3465, 3421, 3557, 3408

    Nouvelle instance de SsortingngBuffer en boucle: temps: 8327, 8324, 8284

    SsortingngBuffer setLength Coût du temps: 22878, 23017, 22894

    Encore une fois SsortingngBuilder setLength pour s'assurer que mon laboratoire n'a pas de problème à utiliser aussi longtemps pour SsortingngBuffer setLength 🙂 Temps: 3448

     SsortingngBuffer sb = new SringBuffer(); // do something wiht it sb = new SsortingngBuffer(); 

    Je pense que ce code est plus rapide.