Differenza tra String vs StringBuilder

In questo articolo String vs StringBuilder, entrambi rappresentano la sequenza di caratteri, la prima differenza tra loro è che la classe String è nello spazio dei nomi di sistema mentre StringBuilder è nel sistema. Spazio dei nomi di testo.

La differenza principale è:

String è immutabile : una volta creata un'istanza di String non è possibile modificarla. Se si modifica il valore della stringa, ciò manterrà la vecchia istanza e creerà una nuova istanza con un nuovo valore in memoria.

StringBuilder è mutabile : se si modifica il valore di stringa utilizzando StringBuilder, non verrà creata una nuova istanza, ma verrà aggiornato il valore nell'istanza esistente.

Confronto testa a testa tra String vs StringBuilder (Infographics)

Di seguito sono riportati i primi 8 confronti tra String e StringBuilder :

Differenze chiave tra String e StringBuilder

Discutiamo alcune differenze chiave tra String vs StringBuilder nei seguenti punti:

1. Mentre si lavora con la classe String, ogni volta che si eseguono alcune operazioni sulla propria stringa, si ricrea ripetutamente l'intera stringa nella memoria mentre StringBuilder alloca dello spazio del buffer nella memoria e applica le modifiche allo spazio del buffer.

2. Poiché l'oggetto StringBuilder è mutabile, fornisce prestazioni migliori rispetto all'oggetto String quando sono coinvolte manipolazioni di stringhe pesanti.

Comprendiamo i punti precedenti con l'aiuto di un esempio riportato di seguito:

Codice:

using System;
using System.Text;
using System.Diagnostics;
public class StringAndStringBuilder
(
static void Main()
(
//using Stopwatch to calculate time
Stopwatch stopWatch = new Stopwatch();
string str = string.Empty;
//starting stop watch
stopWatch.Start();
for (int i = 0; i < 1000; i++)
(
str += i.ToString();
)
stopWatch.Stop();
Console.WriteLine("Time taken by string : (0)", stopWatch.Elapsed);
StringBuilder stringBuilder= new StringBuilder(string.Empty);
//restarting stop watch for StringBuilder
stopWatch.Restart();
for (int i = 0; i < 1000; i++)
(
stringBuilder.Append(i.ToString());
)
stopWatch.Stop();
Console.WriteLine("Time taken by StringBuilder : (0)", stopWatch.Elapsed);
)
)

Produzione:

3. Le operazioni su stringa utilizzano più memoria rispetto a StringBuilder poiché String crea istanze di immondizia intermedie dopo ogni operazione. Vediamo questo nell'esempio seguente:

Codice:

using System;
using System.Text;
using System.Runtime.Serialization;
public class StringAndStringBuilder
(
public static void Main()
(
//using ObjectIDGenerator to generate ID for objects
ObjectIDGenerator idGenerator1 = new ObjectIDGenerator();
bool flag = new bool();
String str = "Sun";
Console.WriteLine("String = (0)", str);
Console.WriteLine("Instance Id : (0)", idGenerator1.GetId(str, out flag));
//flag will be True for new instance otherwise it will be False
Console.WriteLine("This instance is new : (0)\n", flag);
//concatenating strings
str += " rises";
Console.WriteLine("String = (0)", str);
Console.WriteLine("Instance Id : (0)", idGenerator1.GetId(str, out flag));
Console.WriteLine("this instance is new : (0)\n", flag);
str += " in";
Console.WriteLine("String = (0)", str);
Console.WriteLine("Instance Id : (0)", idGenerator1.GetId(str, out flag));
Console.WriteLine("this instance is new : (0)\n", flag);
str += " the";
Console.WriteLine("String = (0)", str);
Console.WriteLine("Instance Id : (0)", idGenerator1.GetId(str, out flag));
Console.WriteLine("this instance is new : (0)\n", flag);
str += " east";
Console.WriteLine("String = (0)", str);
Console.WriteLine("Instance Id : (0)", idGenerator1.GetId(str, out flag));
Console.WriteLine("this instance is new : (0)\n", flag);
//initializing string using StringBuilder
StringBuilder stringBuilder = new StringBuilder("Sun");
ObjectIDGenerator idGenerator2 = new ObjectIDGenerator();
Console.WriteLine("StringBuilder = (0)", stringBuilder);
Console.WriteLine("Instance Id : (0)", idGenerator2.GetId(stringBuilder, out flag));
Console.WriteLine("This instance is new : (0)\n", flag);
stringBuilder.Append(" rises");
Console.WriteLine("StringBuilder = (0)", stringBuilder);
Console.WriteLine("Instance Id : (0)", idGenerator2.GetId(stringBuilder, out flag));
Console.WriteLine("This instance is new : (0)\n", flag);
stringBuilder.Append(" in");
Console.WriteLine("StringBuilder = (0)", stringBuilder);
Console.WriteLine("Instance Id : (0)", idGenerator2.GetId(stringBuilder, out flag));
Console.WriteLine("This instance is new : (0)\n", flag);
stringBuilder.Append(" the");
Console.WriteLine("StringBuilder = (0)", stringBuilder);
Console.WriteLine("Instance Id : (0)", idGenerator2.GetId(stringBuilder, out flag));
Console.WriteLine("This instance is new : (0)\n", flag);
stringBuilder.Append(" east");
Console.WriteLine("StringBuilder = (0)", stringBuilder);
Console.WriteLine("Instance Id : (0)", idGenerator2.GetId(stringBuilder, out flag));
Console.WriteLine("This instance is new : (0)\n", flag);
Console.ReadKey();
)
)

Produzione:

Rappresentazione pittorica del funzionamento interno del programma di cui sopra:

4. Gli oggetti stringa possono essere utilizzati tra thread mentre gli oggetti StringBuilder non sono thread-safe. Pertanto, due o più thread possono chiamare i metodi StringBuilder contemporaneamente.

5. Poiché gli oggetti String sono sicuri per i thread, forniscono la sincronizzazione mentre StringBuilder non fornisce la sincronizzazione.

6. La classe String viene utilizzata quando il valore della stringa rimarrà costante per tutto il programma o quando sono necessarie molte meno modifiche, mentre StringBuilder viene utilizzato quando sono necessarie molte modifiche ripetute o operazioni pesanti sulla stringa.

7. Per un numero molto minore di concatenazioni, la classe String funziona più velocemente rispetto a StringBuilder perché accomodare i caratteri nello spazio buffer e convertire nuovamente l'intero valore in stringa crea un sovraccarico. Pertanto, per il piccolo numero di concatenazioni, StringBuilder funziona più lentamente rispetto al comportamento copia per valore della classe String.

8. Per convertire l'oggetto String nell'oggetto StringBuilder, è necessario passare l'oggetto String al costruttore della classe StringBuilder mentre l'oggetto StringBuilder può essere convertito in String utilizzando il metodo ToString ().

String str = “abc”;
StringBuilder StringBuilder = new StringBuilder(str);
StringBuilder StringBuilder = new StringBuilder(“abc”);
String str = StringBuilder.ToString();

Tabella comparativa di String vs StringBuilder

La tabella seguente riassume i confronti tra String vs StringBuilder :

Parametro Corda StringBuilder
Spazio dei nomiLa classe di stringa si trova nello spazio dei nomi di sistema.La classe StringBuilder si trova nello spazio dei nomi di Testo di sistema.
MutabilitàLa stringa creata usando la classe String è immutabile.La stringa creata utilizzando StringBuilder è modificabile.
PrestazioneLento rispetto a StringBuilder.Veloce rispetto a String. Come se fosse più veloce di String mentre concatena molte stringhe insieme in un ciclo.
Sicurezza del filoThread-safe.Non thread-safe.
SincronizzazioneFornisce la sincronizzazione.Non fornisce la sincronizzazione.
Utilizzo della memoriaRichiede più memoria per creare una nuova istanza se le operazioni eseguite sulla stringa cambiano il suo valore.Richiede meno memoria poiché aggiorna l'istanza esistente.
Natura dell'oggettoL'oggetto String è di sola lettura in natura.L'oggetto di StringBuilder è di natura dinamica.
EfficienzaLa classe String è meno efficiente rispetto a StringBuilder mentre lavora con un gran numero di concatenazioni di stringhe.StringBuilder è più efficiente rispetto a String mentre lavora con un gran numero di concatenazioni di stringhe.

Conclusione

String crea una nuova istanza solo quando il valore della stringa cambia. Se si eseguono determinate operazioni su stringa che non ne modifica il valore, non verrà creata alcuna nuova istanza da String. Due o più valori letterali di stringa con lo stesso contenuto possono avere la stessa posizione di memoria.

Articoli consigliati

Questa è una guida alla differenza principale tra String vs StringBuilder. Qui discutiamo anche le differenze chiave String vs StringBuilder con infografica e tabella comparativa. Puoi anche dare un'occhiata ai seguenti articoli per saperne di più -

  1. I 7 migliori tipi di cifratura
  2. Vantaggi di StringBuilder in C #
  3. StringBuffer vs StringBuilder | I 4 migliori confronti
  4. Migliori differenze - Jira vs Github

Categoria: