StringBuilder

StringBuilder é uma sequência de caracteres mutável, ideal para cenários que requerem modificações frequentes de strings.

Por que StringBuilder é Necessário

String é imutável—toda modificação cria um novo objeto, o que é ineficiente.

Exemplo: String vs StringBuilder

JAVA
// Concatenação de String (ineficiente)
String s = "";
for (int i = 0; i < 10000; i++) {
    s += "a";  // Cria um novo objeto a cada vez
}

// Concatenação StringBuilder (eficiente)
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10000; i++) {
    sb.append("a");  // Modifica o mesmo objeto
}
String result = sb.toString();
▶ Experimente
💡 Diferença de desempenho: Para 10.000 concatenações em loop, StringBuilder é mais de 100x mais rápido que String.

Criando StringBuilder

JAVA
// StringBuilder vazio
StringBuilder sb1 = new StringBuilder();

// Com capacidade inicial
StringBuilder sb2 = new StringBuilder(100);

// Com conteúdo inicial
StringBuilder sb3 = new StringBuilder("Hello");

Métodos Comuns

append(): Adicionar ao Final

JAVA
StringBuilder sb = new StringBuilder();
sb.append("Hello");
sb.append(" ");
sb.append("World");
sb.append(123);
System.out.println(sb);  // HelloWorld123

insert(): Inserir na Posição

JAVA
StringBuilder sb = new StringBuilder("Hello");
sb.insert(5, " World");
System.out.println(sb);  // Hello World

delete(): Excluir Caracteres

JAVA
StringBuilder sb = new StringBuilder("Hello World");
sb.delete(5, 6);  // Excluir caractere no índice 5 (espaço)
System.out.println(sb);  // HelloWorld

replace(): Substituir Caracteres

JAVA
StringBuilder sb = new StringBuilder("Hello World");
sb.replace(6, 11, "Java");
System.out.println(sb);  // Hello Java

reverse(): Inverter String

JAVA
StringBuilder sb = new StringBuilder("Hello");
sb.reverse();
System.out.println(sb);  // olleH

Outros Métodos

Método Descrição Exemplo
charAt() Obter caractere no índice sb.charAt(0)
length() Comprimento atual sb.length()
capacity() Capacidade atual sb.capacity()
setCharAt() Definir caractere no índice sb.setCharAt(0,'h')
substring() Obter substring sb.substring(0,3)

Encadeamento de Métodos

Métodos de StringBuilder retornam this, suportando encadeamento de métodos.

JAVA
String result = new StringBuilder()
    .append("Hello")
    .append(" ")
    .append("World")
    .append("!")
    .toString();

System.out.println(result);  // Hello World!

Exemplo: Construindo Instruções SQL

JAVA
public class SqlBuilder {
    public static String buildSelect(String table, String[] columns, String where) {
        StringBuilder sql = new StringBuilder("SELECT ");
        
        // Nomes das colunas
        sql.append(String.join(", ", columns));
        sql.append(" FROM ");
        sql.append(table);
        
        // Condição
        if (where != null && !where.isEmpty()) {
            sql.append(" WHERE ");
            sql.append(where);
        }
        
        return sql.toString();
    }
    
    public static void main(String[] args) {
        String sql = buildSelect("users", 
            new String[]{"id", "name", "email"}, 
            "age > 18");
        System.out.println(sql);
        // SELECT id, name, email FROM users WHERE age > 18
    }
}

Exemplo: Construindo HTML

JAVA
public class HtmlBuilder {
    public static String buildTable(String[][] data) {
        StringBuilder html = new StringBuilder();
        html.append("<table>\n");
        
        for (String[] row : data) {
            html.append("  <tr>\n");
            for (String cell : row) {
                html.append("    <td>").append(cell).append("</td>\n");
            }
            html.append("  </tr>\n");
        }
        
        html.append("</table>");
        return html.toString();
    }
    
    public static void main(String[] args) {
        String[][] data = {
            {"Alice", "25", "Engineer"},
            {"Bob", "30", "Designer"}
        };
        System.out.println(buildTable(data));
    }
}

StringBuilder vs StringBuffer

Característica StringBuilder StringBuffer
Thread-safe Não Sim
Desempenho Mais rápido Mais lento
Caso de uso Single-threaded Multi-threaded
💡 Recomendação: Use StringBuilder para código single-threaded. Use StringBuffer para código multi-threaded. Geralmente, StringBuilder é preferível.

Capacidade e Crescimento

StringBuilder tem um conceito de capacidade e cresce automaticamente quando excedido.

JAVA
StringBuilder sb = new StringBuilder();
System.out.println("Capacidade inicial: " + sb.capacity());  // 16

// Adicionar conteúdo, cresce quando capacidade excedida
for (int i = 0; i < 20; i++) {
    sb.append("a");
}
System.out.println("Capacidade atual: " + sb.capacity());  // 34
System.out.println("Comprimento atual: " + sb.length());    // 20
💡 Regra de crescimento: Nova capacidade = capacidade antiga * 2 + 2

❓ Perguntas Frequentes

P: Quando devo usar StringBuilder? R: Quando precisar modificar strings frequentemente, como em concatenações em loop ou construção de strings complexas.

P: Como escolher entre StringBuilder e String? R: Use String para poucas operações (mais simples). Use StringBuilder para muitas operações (mais rápido).

P: Qual é a capacidade padrão do StringBuilder? R: 16 por padrão. Você pode especificá-la no construtor.

📖 Resumo

📝 Exercícios

  1. Concatenação de string: Use StringBuilder para concatenar números de 1 a 100, separados por vírgulas
  2. Construção de HTML: Use StringBuilder para construir uma lista não ordenada (ul/li)
  3. Teste de desempenho: Compare a diferença de tempo entre String e StringBuilder para 10.000 concatenações

Próxima Lição

Na próxima lição, aprenderemos sobre Math e Datas — a classe Math e a API de data/hora.

100%