2012-06-30 8 views
12

Duplicar posibles:
String, StringBuffer, and StringBuilderÁmbito de uso de StringBuffer/StringBuilder de cadena

Sabemos que String son inmutables, donde StringBuffer/StringBuilder son mutables. Pero a veces nos confunden qué usar en nuestro código ... el String o StringBuffer/StringBuilder ?? Prácticamente en nuestro código máximo/código rápido usamos para preferir String que StringBuffer/StringBuilder.

Esta pregunta es para resolver la confusión, si tiene alguna idea & adecuada razón para eso, entonces por favor responda.

+0

Sí, este enlace es útil. –

Respuesta

25

A continuación se muestra la diferencia principal entre estas tres clases más comúnmente utilizadas.

  • objetos de la clase String son inmutables mientras que StringBuffer y StringBuilder objetos son mutables.
  • StringBuffer está sincronizado mientras StringBuilder no está sincronizado.
  • El operador de concatenación "+" se implementa internamente utilizando StringBuffer o StringBuilder.

Criterios para elegir entre cadena, StringBuffer y StringBuilder

  • Si el valor del objeto no va a cambiar el uso de clase String ya que un objeto cadena es inmutable.
  • Si el valor del Objeto puede cambiar y solo se accederá desde un solo subproceso , utilice un StringBuilder porque StringBuilder es no sincronizado.
  • En caso de que el valor del Objeto pueda cambiar, y será modificado por múltiples subprocesos , use un StringBuffer porque StringBuffer está sincronizado.
+1

** Su ans es útil **, ¿pero realmente seguimos esto? Creo que la respuesta es ** NO ** –

1

StringBuffers son thread-safe, lo que significa que han sincronizado los métodos para controlar el acceso de forma que sólo un hilo puede acceder código sincronizado de un objeto StringBuffer a la vez. Por lo tanto, los objetos StringBuffer generalmente son seguros de usar en un entorno de subprocesos múltiples.

El acceso de StringBuilder no está sincronizado, por lo que no es seguro para subprocesos. Al no sincronizarse, el rendimiento de StringBuilder puede ser mejor que StringBuffer. Por lo tanto, si está trabajando en un entorno de subproceso único, usar StringBuilder en lugar de StringBuffer puede aumentar el rendimiento.

+2

Tenga en cuenta que es muy, muy raro que dos subprocesos usen el mismo StringBuffer/StringBuilder. Nunca experimenté eso. –

+0

Correcto :) Estoy de acuerdo y gracias por señalarlo :) – verisimilitude

3

La idea principal es que String es inmutable. Entonces, cuando intenta modificarlo, crea un nuevo objeto. StringBuffer y StringBuilder son mutables. Y la diferencia es que el primero es seguro para subprocesos.

El enfoque común para usar StringBuilder es analizar algo cuando se crea iterativamente un objeto String en un entorno NON thread safe.

Por ejemplo, tiene una matriz de números [1, 2, 3]. Para crear el objeto "String1String2String3" se puede utilizar un StringBuilder

StringBuilder builder = new StringBuilder(); 
foreach(Integer num : array) { 
    builder.append("String").append(num); 
} 
builder.toString(); 

Es mejor que sólo el uso de String string = string + ("String" + num);. AFAIK, el compilador optimizará usando la concatenación de cadenas en el bucle para StringBuilder, pero es mejor usarlo manualmente.

StringBuffer se utiliza cuando tiene estados compartidos, que se modifican mediante subprocesos concurrentes.

Cuestiones relacionadas