Diferencia entre StringBuilder y StringBuffer
¿ Cuál es la principal diferencia entre StringBuffer
y StringBuilder
? ¿Hay algún problema de rendimiento al decidirse por alguno de estos?
StringBuffer
está sincronizado, StringBuilder
no lo está.
StringBuilder
es más rápido que StringBuffer
porque no lo es synchronized
.
Aquí hay una prueba de referencia simple:
public class Main {
public static void main(String[] args) {
int N = 77777777;
long t;
{
StringBuffer sb = new StringBuffer();
t = System.currentTimeMillis();
for (int i = N; i --> 0 ;) {
sb.append("");
}
System.out.println(System.currentTimeMillis() - t);
}
{
StringBuilder sb = new StringBuilder();
t = System.currentTimeMillis();
for (int i = N; i > 0 ; i--) {
sb.append("");
}
System.out.println(System.currentTimeMillis() - t);
}
}
}
Una ejecución de prueba proporciona los números de 2241 ms
for StringBuffer
vs 753 ms
for StringBuilder
.
Básicamente, StringBuffer
los métodos están sincronizados mientras StringBuilder
que no.
Las operaciones son "casi" las mismas, pero usar métodos sincronizados en un solo hilo es excesivo.
Eso es todo.
Cita de la API StringBuilder :
Esta clase [StringBuilder] proporciona una API compatible con StringBuffer, pero sin garantía de sincronización . Esta clase está diseñada para usarse como reemplazo directo de StringBuffer en lugares donde el búfer de cadena estaba siendo utilizado por un solo subproceso (como suele ser el caso). Siempre que sea posible, se recomienda utilizar esta clase con preferencia a StringBuffer, ya que será más rápida en la mayoría de las implementaciones.
Entonces se hizo para sustituirlo.
Lo mismo sucedió con Vector
y ArrayList
.