StringBuilder

Desde java 1.5 tenemos la clase StringBuilder. Esta clase es similar a StringBuffer, pero con la diferencia de que no es segura para su uso con varios hilos. Esto, si sólo usamos un hilo, la hace más eficiente que el uso de StringBuffer, ya que no tiene los métodos sincronizados.

La clase StringBuilder es ideal para esos String que construimos a base de concatenar trozos localmente dentro de un método, por ejemplo, para sacar una salida por pantalla o construir una sentencia SQL.

Hay sin embargo un curioso detalle más. El compilador de java es listo y si concatenamos cadenas con el típico +, como por ejemplo

String unaCadena = "hola, " + tuNombre + ". ¿Cómo estas?";

el compilador reemplaza todo esto por una construcción en condiciones usando StringBuilder. En tiempo de ejecución ese código es igual de eficiente que si usáramos StringBuilder y más eficiente que si usamos StringBuffer, contrariamente a lo que pasaba en las primeras versiones de java.

Ahora me alegro de no haberme acostumbrado nunca al uso de StringBuffer.

Tienes todo esto mucho más detallado en Manipulación de cadenas en java.

Esta entrada fue publicada en java. Guarda el enlace permanente.

6 respuestas a StringBuilder

  1. Dani dijo:

    Bueno, no he hecho pruebas, pero según lo que está documentado el compilador ya hacía esto pero con StringBuffer hace tiempo http://java.sun.com/j2se/1.3/docs/api/java/lang/String.html

    Quizás desde java5 tendrá mejor rendimiento los ‘+’ que el StringBuffer pero no con StringBuilder.

    Los String siguen siendo invariantes(http://java.sun.com/javase/6/docs/api/java/lang/String.html), al final es lo mismo que antaño pero debemos utilizar StringBuilder para mejorar el rendimiento.

    El problema claro, código heredado que utilice StringBuffer.

    Saludos!

  2. Chuidiang dijo:

    Hola:

    Como comento en el post, el compilador se encarga de reemplazar nuestros + por StringBuilder, así que el resultado final es exactamente el mismo en ambos casos.

    Se bueno.

  3. Bert dijo:

    En el código heredado, se pueden reemplazar perfectamente (salvo objetos usados por varios hilos) StringBuffer por StringBuilder, ya que los métodos son idénticos. El rendimiento es aproximadamente el doble de velocidad, y salvo en cadenas realmente largas, inapreciable.

    En lo del +, un matiz, el compilador lo sustituye por StringBuilder pero ojo a los +=

    Me explico con un ejemplo:

    String x = «»;
    for (int i=0; i

  4. Chuidiang dijo:

    Como comenta -o intenta comentar- Bert, si no hacemos los + todos seguidos, sino que los metemos en un bucle

    String x=»»;
    for (int i=0;i…)
    x+=»cachoString»

    el compilador no hace la sustitución, puesto que en cada iteración debe tener un String x relleno parcialmente.

    Se bueno.

  5. Bert dijo:

    Traté de ponerlo, pero me pasé de largo y wordpress lo cortó (creo).

    Se puede resumir el uso de StringBuilder, como dicen en la pagina que enlazas:
    -Si es una unica sentencia, con +
    -Si no StringBuilder

  6. penyaskito dijo:

    Me alegro de que te gustara el artículo 🙂

    ¡Pero no uses concatenaciones de cadenas para construir SQLs, salvo en casos muy concretos! A menos que estés muy seguro de lo que estás haciendo…
    Las consultas parametrizadas te ayudan en cuanto a seguridad… y la seguridad importa, más si hablamos de aplicaciones web.

    ¡Un abrazo!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.