Conseils de base inconnus de manière inattendue sur StringBuilder [Java / C #]

Comment initialiser tout en gardant une instance de StringBuilder en vie

J'utilise RingBuilder pour accélérer la liaison de chaînes, mais je suis sûr qu'il y a des moments où je veux réutiliser des instances.

Par exemple, il s'agit du code d'implémentation.

Exemple de code (C#)



StringBuilder sb;

foreach( var x in data )
{
    sb = new StringBuilder();
    
    //Traitement pour modifier une chaîne de caractères
    
    string text = sb.ToString();
}

Exemple de code (Java)



StringBuilder sb;

for ( Object x : data ) {
    sb = new StringBuilder();
    
    //Traitement pour modifier une chaîne de caractères
    
    String text = sb.toString();
}

En bref, il s'agit de recréer une instance dans le but d'effacer la chaîne d'édition.

Je pense que c'est un code que vous voyez souvent.

Cependant, le processus d'édition lui-même n'est pas très lourd, et dans les cas où le coût de création d'une instance de StringBuilder est plus élevé, vous souhaiterez réutiliser l'instance.

Comment effacer StringBuilder

Ainsi, comme pour le titre "Inconnu de manière inattendue", StringBuilder fournit un moyen de vider le tampon de caractères interne * (← explication légèrement trompeuse) * tout en gardant l'instance en vie.

Exemple de code (C#)



var sb = new StringBuilder(); 

foreach( var x in data )
{
    sb.Length = 0; //Cela efface la chaîne précédemment modifiée et vous permet de démarrer une nouvelle modification.
    
    //Traitement pour modifier une chaîne de caractères
    
    string text = sb.ToString();
}

Exemple de code (Java)



StringBuilder sb = new StringBuilder();

for ( Object x : data ) {
    sb.setLength(0);
    
    //Traitement pour modifier une chaîne de caractères
    
    String text = sb.toString();
}

Pour être honnête, quand j'ai découvert cette méthode pour la première fois, j'ai pensé ** "J'aurais aimé préparer la méthode StringBuilder.Clear () à la place!" **.

Eh bien, le nombre de méthodes Clear a augmenté.

C#: https://msdn.microsoft.com/ja-jp/library/system.text.stringbuilder.clear(v=vs.110).aspx

Java: J'ai recherché, mais Java n'avait pas de méthodes plus claires. Va-t-il augmenter avec Java 9? ??

Explication supplémentaire @Java

En Java, l'opérateur "+", qui fait la concaténation de chaînes (apparemment à partir d'une ancienne version), générera du bytecode en utilisant StringBuilder une fois compilé.

Je suis entré en Java à partir de l'ère Java 7 (quand j'étais excité d'apprendre que des lambdas avaient été ajoutés dans Java 8), donc je ne savais pas du tout jusqu'à ce que je fasse des recherches sur diverses choses. En dehors de cela, l'implémentation interne de substring a changé, et il semble qu'il y ait eu divers changements en raison de sa longue histoire (que C #), il est donc intéressant d'étudier ce domaine également.

Code implémenté avec l'opérateur plus



String a = "C'est vrai,";
String b = "nous";
String c = "Parce que c'est intelligent."
String text = a + b + c; //Oui, parce que nous sommes intelligents.

Code équivalent au résultat de la compilation



String a = "C'est vrai,";
String b = "nous";
String c = "Parce que c'est intelligent."
String text = new StringBuilder().append( a ).append( b ).append( c ).toString(); //Oui, parce que nous sommes intelligents.

Précautions et autres choses qui viennent après.

** Ne rendez pas StringBuilder trop long: **

Bien qu'il existe des moyens de l'effacer, StringBuilder est un tampon d'édition en premier lieu et ne devrait pas avoir une très longue durée de vie. Surtout, il n'y a pas de nombre de fois ou de dizaines de fois la vitesse de traitement peut être augmentée en utilisant ce moyen de compensation.

N'en faites pas trop.

** C'est juste une "zone d'édition", un tampon: **

La position selon laquelle StringBuilder n'est qu'une zone tampon au milieu de l'édition ne doit pas être modifiée, La réutilisation d'une instance, son effacement et son utilisation doivent être supprimés au mieux par "un niveau qui est terminé dans le processus qui commence par une seule méthode publique".

Un autre critère important est de savoir si le code "new StringBuilder ();" est trop fort comme du bruit. Si cela est trop visible par rapport à la logique principale courte et simple, je pense que ce serait mieux si vous pouviez écrire "sb.Clear ();" pour rendre le code plus intuitif.

** En pensant à la propriété Length: **

En outre, personnellement, il n'est pas intuitif en premier lieu qu '"une valeur puisse être définie pour Longueur, qui est une propriété qui obtient le nombre de caractères suite à la modification d'une chaîne de caractères", et ceci est fourni comme moyen d'effacement. Je me suis demandé comment c'était. La longueur est en lecture seule et je pense que la méthode Clear devrait être fournie comme moyen de compensation.

Eh bien, c'est bien parce que je fais rarement "construire des chaînes de caractères dans le désordre" ces jours-ci.

Recommended Posts

Conseils de base inconnus de manière inattendue sur StringBuilder [Java / C #]
À propos de la classe Java StringBuilder
[Java] À propos de String et StringBuilder
Astuces Java, astuces
[Connaissance de base de Java] À propos de la conversion de type
Astuces Java
À propos de l'interface Java
[Java] À propos des fonctionnalités de Java 12
CONSEILS relatifs au code Java
[Java] À propos des tableaux
Grammaire de base Java
Grammaire Java de base
Connaissances de base Java 1
Quelque chose à propos de java
Où est Java
À propos des fonctionnalités Java
[Java] Structure de base
[Java] [Basic] Glossaire
À propos des threads Java
Interface [Java]
À propos de la classe Java
Grammaire de base Java
À propos des tableaux Java
Grammaire de base Java
À propos de l'héritage Java
À propos de l'interface, interface java
Exercice Java [basique]
À propos de Java Var
À propos de Java Literal
À propos des commandes Java
A propos du type de données de base Java et de la mémoire du type de référence