String, StringBuffer y StringBuilder en Java

La clase String se utiliza en Java, como todos sabréis, para representar una cadena de caracteres inmutable, es decir, que no puede modificarse. Si utilizamos algún método que modifique la cadena, lo que ocurrirá en realidad es que se creará un nuevo objeto String.

Para cadenas de caracteres mutables se utilizaba hasta Java 5 la clase StringBuffer. Desde Java 5 tenemos una nueva opción, StringBuilder, que se diferencia de StringBuffer en que sus métodos no están sincronizados. Esto significa que StringBuilder ofrece mejor rendimiento que StringBuffer, aunque tenemos que tener algo más de cuidado al modificarlo si utilizamos varios threads.

En resumen:

  • Si el texto no va a cambiar: String
  • Si el texto puede cambiar y sólo vamos a tener un hilo trabajando con la cadena: StringBuilder.
  • Si el texto puede cambiar y vamos a tener más de un hilo trabajando con la cadena: StringBuffer.

Sin embargo hay alguna que otra excepción. Por ejemplo cuando se concatenan varios literales o constantes con el operador +, el compilador es suficientemente inteligente para crear un solo objeto String.

public class EjemploString {
  public static void main(String[] args) {
    final String ESPACIO = " ";
    String s = "Hola" + ESPACIO + "Mundo";
  }
}

También es interesante mencionar que la diferencia entre StringBuilder y StringBuffer se ha reducido en Java 6 y la diferencia será menor con Java 7, gracias a las nuevas mejoras en sincronización.

Comentarios
  1. Hace algún tiempo escribí un post sobre este tema en mi blog. Realmente no digo mucho más, pero por si os interesa:

    http://java-spain.com/curiosidades-java-optimizacion-strings-ii

    Responder

  2. StringBuffer si lo conocía.. ahora que era la primera vez que escuchaba hablar de la clase StringBuilder… genial aporte!

    Responder

  3. Aunque no está directamente relacionada, hay una clase llamada StringTokenizer que trabaja con Strings y resulta ideal para tratar cadenas formateadas. 😉

    Responder

  4. DiZo

    Otro que no conocía la clase StringBuilder, resulta muy cómoda como ha mencionado Death Master.

    PD: ¿Qué plugin usas para formatear el código fuente?

    Responder

  5. Interesante, no conocia esto y se que me va a servir.

    Responder

  6. @Skatox no es un plugin, es un script en JavaScript: SyntaxHighlighter

    Responder

  7. @Dead Master, que pena la ignorancia, pero que son cadenas formateadas; yo solo he usado string tokenizer para tratar directamente con los caracteres de un string.

    Responder

  8. Tampoco conocia StringBuilder, buen aporte zootropo, como siempre

    Responder

  9. @Escarrion, me refiero a cadenas con formatos concretos. Por ejemplo, si tienes un String con formato CSV (comma separated values), puedes crear un nuevo StringTokenizer con dicha cadena, usando como carácter delimitador “,”.

    Cada vez que invoques a “nextToken()” te devolverá automáticamente los valores, sin tener que hacer ningún tipo de comprobación de caracteres, ni eliminar los delimitadores, etc.

    Responder

  10. […] en el caso de StringBuffer y StringBuilder la principal diferencia entre ambas clases es que Vector<E> es sincronizada y […]

    Responder

  11. Rodrigo

    q aoportazo bueno la verdad es q estoy realizando un corso de preparacion para java y me gustaria saber si existe la traduccion de las api o en su defecto si alguien las tiene para descargar pues en el sitio de sun se cae el link gracias
    por favoer enviarme correo a rdrigo.cancino.y@gmail.com

    Responder

  12. alvaro

    Oye muy buena informacion gracias.

    Responder

  13. Edwin Tumax

    Para los que tienen pensado certificarse en SCJP, este tema es un punto que se evalua en el examen.

    Responder

  14. estudiantes de ingenieria en sistemas estudiar todo lo relacionado a programacion 1 es pesado ponganle mente

    Responder

  15. […] en el caso de StringBuffer y StringBuilder la principal diferencia entre ambas clases es que Vector<E> es sincronizada y […]

    Responder

  16. Huascar

    no se si alguien podria subir algun ejemplo con la clase StringBuffer.

    Responder

Deja un comentario