0Pricing
Java Academy · Lección

StringBuilder para una concatenación eficiente

Use StringBuilder para construir cadenas de forma eficaz dentro de bucles y en formatos complejos.

StringBuilder para una concatenación eficiente es una lección gratuita de Java Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Java Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Java Academy incluye 4 lecciones en total.

StringBuilder para una concatenación eficiente

StringBuilder es una alternativa mutable a String para crear texto de forma incremental. Evita crear muchos objetos String intermedios.

StringBuilder frente a la concatenación de String

Al concatenar muchas cadenas, especialmente en bucles, StringBuilder es mucho más rápido porque modifica un búfer interno de caracteres en lugar de crear objetos nuevos.

// Inefficient: creates a new String every iteration
String result = "";
for (int i = 0; i < 1000; i++) {
    result += i + ","; // 1000 new String objects!
}

// Efficient: StringBuilder uses a resizable char buffer
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 1000; i++) {
    sb.append(i).append(',');
}
String efficient = sb.toString(); // one final String created

API de StringBuilder

Métodos principales: append, insert, delete, replace, reverse, toString, length, charAt, setCharAt.

StringBuilder sb = new StringBuilder("Hello");

sb.append(", World");     // Hello, World
sb.insert(5, "!");        // Hello!, World
sb.delete(5, 6);           // Hello, World
sb.replace(7, 12, "Java"); // Hello, Java
sb.reverse();               // avaJ ,olleH
sb.reverse();               // Hello, Java

System.out.println(sb);         // Hello, Java
System.out.println(sb.length()); // 11
System.out.println(sb.charAt(0)); // H

Encadenar llamadas a append

Todos los métodos mutables, incluido append, devuelven this, lo que permite encadenar llamadas de forma fluida.

StringBuilder html = new StringBuilder()
    .append("<div class=\"card\">")
    .append("<h2>").append("Product Title").append("</h2>")
    .append("<p>Price: $").append(String.format("%.2f", 29.99)).append("</p>")
    .append("<button>Add to Cart</button>")
    .append("</div>");

System.out.println(html.toString());

Capacidad inicial

Asigne previamente a StringBuilder una capacidad esperada para evitar que se redimensione la matriz interna y mejorar el rendimiento con cadenas grandes.

// Default capacity: 16 chars
StringBuilder small = new StringBuilder();

// Pre-sized: 10 items * ~50 chars each
StringBuilder report = new StringBuilder(500);

for (int i = 1; i <= 10; i++) {
    report.append(String.format("%-3d. Record %04d: processed OK%n", i, i));
}

System.out.println(report.toString().substring(0, 30));
// "  1. Record 0001: processed OK"

deleteCharAt y eliminaciones específicas

deleteCharAt elimina un solo carácter. delete(start, end) elimina un intervalo. Estas operaciones tienen una complejidad O(n) debido al desplazamiento de la matriz.

StringBuilder sb = new StringBuilder("Hello, World!");

sb.deleteCharAt(5);     // removes comma: "Hello World!"
sb.delete(5, 6);         // removes space: "HelloWorld!"

System.out.println(sb); // HelloWorld!

// Replace to fix a typo
StringBuilder typo = new StringBuilder("Helo, Java!");
typo.replace(typo.indexOf("Helo"), typo.indexOf("Helo") + 4, "Hello");
System.out.println(typo); // Hello, Java!

Crear CSV

Un patrón práctico: crear una línea CSV con StringBuilder y gestionar correctamente los separadores.

import java.util.List;

static String toCsv(List<String> values) {
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < values.size(); i++) {
        if (i > 0) sb.append(',');
        sb.append(escapeCsv(values.get(i)));
    }
    return sb.toString();
}

static String escapeCsv(String s) {
    if (s.contains(",") || s.contains("\""))
        return "\"" + s.replace("\"", "\"\"") + "\"";
    return s;
}

System.out.println(toCsv(List.of("Alice", "Smith, Jr.", "30")));
// Alice,"Smith, Jr.",30

StringJoiner para resultados separados por delimitadores

StringJoiner simplifica la unión de elementos con un delimitador y un prefijo y sufijo opcionales; no es necesario gestionar los separadores manualmente.

import java.util.StringJoiner;

StringJoiner sj = new StringJoiner(", ", "[", "]");
sj.add("Alice");
sj.add("Bob");
sj.add("Charlie");
System.out.println(sj.toString()); // [Alice, Bob, Charlie]

// Equivalent with String.join
String joined = String.join(", ", "Alice", "Bob", "Charlie");
System.out.println(joined); // Alice, Bob, Charlie

// Streams: collect with joining collector
import java.util.stream.*;
List.of("a", "b", "c").stream()
    .collect(Collectors.joining(", ", "(", ")"));
// (a, b, c)

StringBuilder frente a StringBuffer

StringBuffer es la versión sincronizada y segura para subprocesos de StringBuilder. Es más lento debido al bloqueo. Utilice StringBuilder en contextos de un solo subproceso (el 99 % de los casos).

// StringBuffer: thread-safe but slower (synchronized methods)
StringBuffer buf = new StringBuffer();
buf.append("Thread-safe");
buf.append(" but slow");

// StringBuilder: not thread-safe but faster
StringBuilder sb = new StringBuilder();
sb.append("Fast");
sb.append(" single-threaded");

// When to use StringBuffer:
// - Multiple threads write to the same buffer
// - Almost always a design smell — redesign to avoid sharing

Invertir y comprobar palíndromos

El método reverse() integrado de StringBuilder permite comprobar palíndromos de forma elegante.

static boolean isPalindrome(String s) {
    String cleaned = s.toLowerCase()
        .replaceAll("[^a-z0-9]", ""); // remove non-alphanumeric
    String reversed = new StringBuilder(cleaned).reverse().toString();
    return cleaned.equals(reversed);
}

System.out.println(isPalindrome("A man, a plan, a canal: Panama")); // true
System.out.println(isPalindrome("race a car"));                      // false
System.out.println(isPalindrome("Was it a car or a cat I saw?"));    // true

En la práctica: creador de consultas SQL

Crear una consulta SQL dinámica con StringBuilder, añadiendo cláusulas where de forma condicional.

static String buildQuery(String category, Double minPrice, Double maxPrice) {
    StringBuilder sql = new StringBuilder("SELECT * FROM products WHERE 1=1");
    if (category != null)
        sql.append(" AND category = '" + category + "'");
    if (minPrice != null)
        sql.append(" AND price >= ").append(minPrice);
    if (maxPrice != null)
        sql.append(" AND price <= ").append(maxPrice);
    sql.append(" ORDER BY name");
    return sql.toString();
}

System.out.println(buildQuery("Electronics", 50.0, null));
// SELECT * FROM products WHERE 1=1 AND category = 'Electronics' AND price >= 50.0 ORDER BY name

Comprobación rápida

¿Por qué la concatenación de cadenas con + es ineficiente en los bucles?

Resumen: StringBuilder para una concatenación eficiente

Conclusiones principales:

  • StringBuilder es mutable: append, insert y delete modifican un búfer interno
  • Utilice StringBuilder en los bucles para evitar la creación de cadenas con complejidad O(n²)
  • Todos los métodos mutables devuelven this, lo que permite encadenar llamadas de forma fluida
  • Asigne previamente a StringBuilder la capacidad esperada para reducir las redimensiones internas
  • StringJoiner y String.join son opciones prácticas para resultados separados por delimitadores
  • StringBuffer es la alternativa sincronizada (segura para subprocesos), pero más lenta

Preguntas frecuentes

¿La lección «StringBuilder para una concatenación eficiente» es gratis?

Sí — el texto completo de «StringBuilder para una concatenación eficiente» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Java Academy, actualiza a CoddyKit PRO. El curso de Java Academy incluye 4 lecciones en total.

¿Qué aprenderé en «StringBuilder para una concatenación eficiente»?

Use StringBuilder para construir cadenas de forma eficaz dentro de bucles y en formatos complejos. Practicas Java Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Java Academy?

No se requiere experiencia previa. Java Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.

¿Cuánto tiempo toma la lección «StringBuilder para una concatenación eficiente»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Java Academy?

Sí. Cada lección de Java Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Inmutabilidad de String y el pool de cadenas
  2. StringBuilder para una concatenación eficiente
  3. Bloques de texto y String.format
  4. Expresiones regulares con Pattern y Matcher
← Volver a Java Academy