Diferencia entre String y StringBuilder

En este artículo, String vs StringBuilder, ambos representan la secuencia de caracteres, la primera diferencia entre ellos es que la clase String está en el espacio de nombres del sistema, mientras que StringBuilder está en el sistema. Espacio de nombres de texto.

La principal diferencia es:

String es inmutable : una vez que crea una instancia de String, no puede cambiarla. Si cambia el valor de la cadena, esto mantendrá la instancia anterior y creará una nueva instancia con un nuevo valor en la memoria.

StringBuilder es mutable : si cambia el valor de cadena utilizando StringBuilder, no creará una nueva instancia sino que actualizará el valor en la instancia existente.

Comparación cara a cara entre String y StringBuilder (Infografía)

A continuación se muestran las 8 comparaciones principales entre String y StringBuilder :

Diferencias clave entre String y StringBuilder

Discutamos algunas diferencias clave entre String y StringBuilder en los siguientes puntos:

1. Mientras trabaja con la clase String, cada vez que realiza algunas operaciones en su cadena, recrea la cadena completa en la memoria una y otra vez, mientras que StringBuilder asigna algo de espacio de búfer en la memoria y aplica modificaciones en ese espacio de búfer.

2. Como el objeto StringBuilder es mutable, proporciona un mejor rendimiento en comparación con el objeto String cuando se trata de manipulaciones pesadas de cadenas.

Comprendamos los puntos anteriores con la ayuda de un ejemplo dado a continuación:

Código:

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);
)
)

Salida:

3. Las operaciones de cadena utilizan más memoria en comparación con StringBuilder porque la cadena crea instancias de basura intermedias después de cada operación. Veamos esto en el siguiente ejemplo:

Código:

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();
)
)

Salida:

Representación pictórica del funcionamiento interno del programa anterior:

4. Los objetos de cadena se pueden usar en subprocesos, mientras que los objetos de StringBuilder no son seguros para subprocesos. Por lo tanto, dos o más subprocesos pueden llamar a los métodos StringBuilder simultáneamente.

5. Como los objetos String son seguros para subprocesos, proporcionan sincronización, mientras que StringBuilder no proporciona sincronización.

6. La clase de cadena se usa cuando el valor de la cadena se mantendrá constante en todo el programa o cuando se requieren muy pocas modificaciones, mientras que StringBuilder se usa cuando se requieren muchas modificaciones repetidas u operaciones pesadas para realizar en la cadena.

7. Para un número muy inferior de concatenaciones, la clase String funciona más rápido en comparación con StringBuilder porque acomodar caracteres en el espacio del búfer y luego convertir todo el valor a cadena nuevamente, crea una sobrecarga. Por lo tanto, para el pequeño número de concatenaciones, StringBuilder funciona más lentamente en comparación con el comportamiento de copiar por valor de la clase String.

8. Para convertir el objeto String en el objeto StringBuilder, necesitamos pasar el objeto String al constructor de la clase StringBuilder, mientras que el objeto StringBuilder se puede convertir a String utilizando el método ToString ().

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

Tabla comparativa de String vs StringBuilder

La siguiente tabla resume las comparaciones entre String y StringBuilder :

Parámetro Cuerda StringBuilder
Espacio de nombresLa clase de cadena está en el espacio de nombres del sistema.La clase StringBuilder está en el espacio de nombres de texto del sistema.
MutabilidadLa cadena creada con la clase String es inmutable.La cadena creada con StringBuilder es mutable.
ActuaciónLento en comparación con StringBuilder.Rápido en comparación con String. Como si fuera más rápido que String mientras concatena muchas cadenas juntas en un bucle.
Hilo de seguridadA salvo de amenazas.No es seguro para subprocesos.
SincronizaciónProporciona sincronización.No proporciona sincronización.
Uso de memoriaRequiere más memoria para crear una nueva instancia si las operaciones realizadas en cadena cambian su valor.Requiere menos memoria ya que actualiza la instancia existente.
Naturaleza del objetoObject of String es de solo lectura en la naturaleza.El objeto de StringBuilder es de naturaleza dinámica.
EficienciaLa clase de cadena es menos eficiente en comparación con StringBuilder mientras se trabaja con una gran cantidad de concatenaciones de cadena.StringBuilder es más eficiente en comparación con String mientras trabaja con una gran cantidad de concatenaciones de cadenas.

Conclusión

La cadena crea una nueva instancia solo cuando cambia el valor de la cadena. Si realiza ciertas operaciones en una cadena que no cambia su valor, entonces no habrá ninguna nueva creación de instancia por parte de String. Dos o más literales de cadena con el mismo contenido pueden tener la misma ubicación de memoria.

Artículos recomendados

Esta es una guía de la principal diferencia entre String y StringBuilder. Aquí también discutimos las diferencias clave entre String y StringBuilder con infografías y tabla de comparación. También puede echar un vistazo a los siguientes artículos para obtener más información:

  1. Los 7 tipos principales de cifrado
  2. Ventajas de StringBuilder en C #
  3. StringBuffer vs StringBuilder | Comparación de los 4 principales
  4. Principales diferencias: Jira vs Github