¿Cuál es la principal diferencia entre StringBuffer
y StringBuilder
? ¿Hay algún problema de rendimiento al decidir sobre alguno de estos?
java
stringbuilder
stringbuffer
Tigre negro
fuente
fuente
StringBuilder
es más rápido queStringBuffer
porque no lo essynchronized
.Aquí hay una prueba de referencia simple:
Una prueba de funcionamiento da los números de
2241 ms
forStringBuffer
vs753 ms
forStringBuilder
.fuente
--> 0
en un bucle. Me tomó un momento darme cuenta de lo que significa. ¿Es esto algo que realmente se usa en la práctica en lugar de la...; i > 0; i--
sintaxis habitual ?i -->
es realmente molesto en cuanto a la sintaxis ... Al principio pensé que era una flecha debido a los comentarios sobre el arte ASCII.main()
Además, su punto de referencia es injusto. No hay calentamiento.Básicamente, los
StringBuffer
métodos se sincronizan mientras queStringBuilder
no.Las operaciones son "casi" iguales, pero usar métodos sincronizados en un solo hilo es excesivo.
Eso es más o menos al respecto.
Cita de la API StringBuilder :
Entonces se hizo para sustituirlo.
Lo mismo sucedió con
Vector
yArrayList
.fuente
Hashtable
yHashMap
.Simplemente use a
StringBuilder
menos que realmente esté tratando de compartir un búfer entre hilos.StringBuilder
es el hermano menor no sincronizado (menos sobrecarga = más eficiente) de laStringBuffer
clase sincronizada original .StringBuffer
vino primero. Sun estaba preocupado por la corrección en todas las condiciones, por lo que lo sincronizaron para que sea seguro para subprocesos por si acaso.StringBuilder
vino después La mayoría de los usos deStringBuffer
eran de un solo hilo y pagaban innecesariamente el costo de la sincronización.Dado que
StringBuilder
es un reemplazo directoStringBuffer
sin la sincronización, no habría diferencias entre los ejemplos.Si está tratando de compartir entre hilos, puede usar
StringBuffer
, pero considere si es necesaria una sincronización de nivel superior, por ejemplo, tal vez en lugar de usar StringBuffer, si sincroniza los métodos que usan StringBuilder.fuente
Primero veamos las similitudes : StringBuilder y StringBuffer son mutables. Eso significa que puede cambiar el contenido de ellos, en la misma ubicación.
Diferencias : StringBuffer también es mutable y está sincronizado. Donde como StringBuilder es mutable pero no está sincronizado de forma predeterminada.
Significado de sincronizado (sincronización) : cuando algo está sincronizado, pueden acceder múltiples hilos y modificarlo sin ningún problema o efecto secundario. StringBuffer está sincronizado, por lo que puede usarlo con múltiples hilos sin ningún problema.
¿Cuál usar cuando? StringBuilder: cuando necesita una cadena, que puede ser modificable, y solo un hilo está accediendo y modificándola. StringBuffer: cuando necesita una cadena, que puede ser modificable, y múltiples hilos están accediendo y modificándola.
Nota : No use StringBuffer innecesariamente, es decir, no lo use si solo un subproceso está modificando y accediendo a él porque tiene mucho código de bloqueo y desbloqueo para la sincronización que innecesariamente tomará tiempo de CPU. No use cerraduras a menos que sea necesario.
fuente
En subprocesos individuales, StringBuffer no es significativamente más lento que StringBuilder , gracias a las optimizaciones de JVM. Y en subprocesos múltiples, no puede usar de forma segura un StringBuilder.
Aquí está mi prueba (no un punto de referencia, solo una prueba):
Resultados:
cadenas: 319740
Buffers: 23
Generador: 7!
Por lo tanto, los constructores son más rápidos que los búferes, y MUCHO más rápido que la concatenación de cadenas. Ahora usemos un ejecutor para múltiples hilos:
Ahora los StringBuffers tardan 157 ms para 100000 anexos. No es la misma prueba, pero en comparación con los 37 ms anteriores, puede asumir con seguridad que los anexos de StringBuffers son más lentos con el uso de subprocesos múltiples . La razón es que el JIT / punto de acceso / compilador / algo hace optimizaciones cuando detecta que no hay necesidad de verificar los bloqueos.
Pero con StringBuilder, tiene java.lang.ArrayIndexOutOfBoundsException , porque un hilo concurrente intenta agregar algo donde no debería.
La conclusión es que no tienes que perseguir a StringBuffers. Y donde tenga hilos, piense en lo que están haciendo, antes de intentar ganar unos pocos nanosegundos.
fuente
withString+="some string"+i+" ; ";
no es equivalente a los otros dos bucles y, por lo tanto, no es una comparación justa.StringBuilder se introdujo en Java 1.5, por lo que no funcionará con JVM anteriores.
De los Javadocs :
fuente
StringBuilder
.Aquí están las diferencias, he notado:
StringBuffer: -
StringBuilder: -
Cosa común :-
fuente
StringBuffer
StringBuilder
StringBuffer
sin ningún otro cambiofuente
append
dos veces, oappend
ytoString
no no es seguro.StringBuilder no es seguro para subprocesos. String Buffer es. Más información aquí .
EDITAR: En cuanto al rendimiento, después de que se activa el punto de acceso , StringBuilder es el ganador. Sin embargo, para pequeñas iteraciones, la diferencia de rendimiento es insignificante.
fuente
StringBuilder
yStringBuffer
son casi lo mismo La diferencia es queStringBuffer
está sincronizado yStringBuilder
no lo está. Aunque,StringBuilder
es más rápido queStringBuffer
, la diferencia en el rendimiento es muy pequeña.StringBuilder
es un reemplazo de SUN deStringBuffer
. Simplemente evita la sincronización de todos los métodos públicos. En lugar de eso, su funcionalidad es la misma.Ejemplo de buen uso:
Si su texto va a cambiar y es usado por múltiples hilos, entonces es mejor usarlo
StringBuffer
. Si su texto va a cambiar pero es usado por un solo hilo, entonces úseloStringBuilder
.fuente
StringBuffer
StringBuffer es mutable significa que uno puede cambiar el valor del objeto. El objeto creado a través de StringBuffer se almacena en el montón. StringBuffer tiene los mismos métodos que StringBuilder, pero cada método en StringBuffer está sincronizado, es decir, StringBuffer es seguro para subprocesos.
Debido a esto, no permite que dos hilos accedan simultáneamente al mismo método. Se puede acceder a cada método por un hilo a la vez.
Pero ser seguro para subprocesos también tiene desventajas ya que el rendimiento de StringBuffer impacta debido a la propiedad segura para subprocesos. Por lo tanto, StringBuilder es más rápido que StringBuffer cuando llama a los mismos métodos de cada clase.
El valor de StringBuffer se puede cambiar, significa que se puede asignar al nuevo valor. Hoy en día es una pregunta de entrevista más común, las diferencias entre las clases anteriores. String Buffer se puede convertir a la cadena mediante el método toString ().
StringBuilder
StringBuilder es igual que StringBuffer, es decir, almacena el objeto en el montón y también se puede modificar. La principal diferencia entre StringBuffer y StringBuilder es que StringBuilder tampoco es seguro para subprocesos. StringBuilder es rápido ya que no es seguro para subprocesos.
Recurso: String Vs StringBuffer Vs StringBuilder
fuente
String
Es un inmutable.StringBuffer
Es un mutable y sincronizado.StringBuilder
también es mutable pero no está sincronizado.fuente
El javadoc explica la diferencia:
fuente
StringBuilder
(introducido en Java 5) es idéntico aStringBuffer
, excepto que sus métodos no están sincronizados. Esto significa que tiene un mejor rendimiento que este último, pero el inconveniente es que no es seguro para subprocesos.Lea el tutorial para más detalles.
fuente
Un programa simple que ilustra la diferencia entre StringBuffer y StringBuilder:
fuente
StringBuffer se usa para almacenar cadenas de caracteres que se cambiarán (los objetos de cadena no se pueden cambiar). Se expande automáticamente según sea necesario. Clases relacionadas: String, CharSequence.
StringBuilder se agregó en Java 5. Es idéntico en todos los aspectos a StringBuffer, excepto que no está sincronizado, lo que significa que si varios subprocesos acceden al mismo tiempo, podría haber problemas. Para los programas de un solo subproceso, el caso más común, evitar la sobrecarga de sincronización hace que StringBuilder sea un poco más rápido.
fuente
StringBuilder
s generalmente son locales para un método, donde solo son visibles para un subproceso.StringBuffer
está sincronizado, peroStringBuilder
no lo está. Como resultado,StringBuilder
es más rápido queStringBuffer
.fuente
StringBuffer es mutable. Puede cambiar en términos de longitud y contenido. Los StringBuffers son seguros para subprocesos, lo que significa que tienen métodos sincronizados para controlar el acceso, de modo que solo un subproceso puede acceder al código sincronizado de un objeto StringBuffer a la vez. Por lo tanto, los objetos StringBuffer son generalmente seguros de usar en un entorno de subprocesos múltiples donde varios subprocesos pueden estar intentando acceder al mismo objeto StringBuffer al mismo tiempo.
StringBuilder La clase StringBuilder es muy similar a StringBuffer, excepto que su acceso no está sincronizado, por lo que no es seguro para subprocesos. Al no estar sincronizado, el rendimiento de StringBuilder puede ser mejor que StringBuffer. Por lo tanto, si está trabajando en un entorno de subproceso único, el uso de StringBuilder en lugar de StringBuffer puede aumentar el rendimiento. Esto también es cierto para otras situaciones, como una variable local StringBuilder (es decir, una variable dentro de un método) donde solo un hilo accederá a un objeto StringBuilder.
fuente
StringBuffer:
StringBuilder
fuente
String c = a + b
es equivalente aString c = new StringBuilder().append(a).append(b).toString()
, por lo que no es más rápido. Es sólo que crear uno nuevo para cada asignación de cadena, mientras que usted podría tener sólo uno (String d = a + b; d = d + c;
esString d = new StringBuilder().append(a).append(b).toString(); d = new StringBuilder().append(d).append(c).toString();
mientrasStringBuilder sb = new StringBuilder(); sb.append(a).append(b); sb.append(c); String d = sb.toString();
se ahorraría una instanciation StringBuilder).Constructor de cadenas :
String-Buffer
Se recomienda usar StringBuilder siempre que sea posible porque es más rápido que StringBuffer. Sin embargo, si la seguridad del subproceso es necesaria, la mejor opción son los objetos StringBuffer.
fuente
Mejor uso
StringBuilder
ya que no está sincronizado y, por lo tanto, ofrece un mejor rendimiento.StringBuilder
es un reemplazo directo de los más antiguosStringBuffer
.fuente
StringBu(ff|ild)er
es una variable local utilizada solo por un solo hilo.Dado que
StringBuffer
está sincronizado, necesita un esfuerzo adicional, por lo tanto, basado en perforación, es un poco más lento queStringBuilder
.fuente
No hay diferencias básicas entre
StringBuilder
yStringBuffer
, solo existen unas pocas diferencias entre ellos. EnStringBuffer
los métodos están sincronizados. Esto significa que a la vez solo un hilo puede operar en ellos. Si hay más de un hilo, el segundo tendrá que esperar a que termine el primero y el tercero tendrá que esperar a que terminen el primero y el segundo, y así sucesivamente. Esto hace que el proceso sea muy lento y, por lo tanto, el rendimiento en el casoStringBuffer
es bajo.Por otro lado,
StringBuilder
no está sincronizado. Esto significa que a la vez pueden operar múltiples hilos en el mismoStringBuilder
objeto al mismo tiempo. Esto hace que el proceso sea muy rápido y, por lo tanto, el rendimientoStringBuilder
es alto.fuente
A
String
es un objeto inmutable, lo que significa que el valor no se puede cambiar mientras queStringBuffer
es mutable.El
StringBuffer
está sincronizado, por lo tanto Hilo de seguridad mientras queStringBuilder
no y adecuado es, por únicos casos de un único subproceso.fuente
La principal diferencia es que
StringBuffer
está sincronizada, pero no loStringBuilder
está. Si necesita usar más de un hilo, se recomienda StringBuffer. Pero , según la velocidad de ejecución,StringBuilder
es más rápida queStringBuffer
porque no está sincronizada.fuente
Verifique las partes internas del método de adición sincronizada de
StringBuffer
y el método de adición no sincronizada deStringBuilder
.StringBuffer :
StringBuilder :
Como agregar es
synchronized
,StringBuffer
tiene una sobrecarga de rendimiento en comparación con elStrinbBuilder
escenario de subprocesos múltiples. Siempre y cuando no esté compartiendo el búfer entre varios subprocesos, useStringBuilder
, lo que es rápido debido a la ausencia desynchronized
métodos in append.fuente
Aquí está el resultado de la prueba de rendimiento para String vs StringBuffer vs StringBuilder . Finalmente, StringBuilder ganó la prueba. Vea a continuación el código de prueba y el resultado.
Código :
Ejecutame en ideone
Resultado :
100000 iteraciones para agregar un solo texto
10000 iteraciones para agregar un solo texto
fuente
fuente
StringBuffer está sincronizado y es seguro para subprocesos, StringBuilder no está sincronizado y es más rápido.
fuente