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
// 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();
Criando StringBuilder
// 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
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
StringBuilder sb = new StringBuilder("Hello");
sb.insert(5, " World");
System.out.println(sb); // Hello World
delete(): Excluir Caracteres
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
StringBuilder sb = new StringBuilder("Hello World");
sb.replace(6, 11, "Java");
System.out.println(sb); // Hello Java
reverse(): Inverter String
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.
String result = new StringBuilder()
.append("Hello")
.append(" ")
.append("World")
.append("!")
.toString();
System.out.println(result); // Hello World!
Exemplo: Construindo Instruções SQL
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
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 |
Capacidade e Crescimento
StringBuilder tem um conceito de capacidade e cresce automaticamente quando excedido.
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
❓ 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
- StringBuilder é uma sequência de caracteres mutável, ideal para modificações frequentes
- Métodos comuns: append/insert/delete/replace/reverse
- Suporta encadeamento de métodos
- Use StringBuilder para código single-threaded, StringBuffer para multi-threaded
- Capacidade padrão é 16, cresce automaticamente quando excedida
📝 Exercícios
- Concatenação de string: Use StringBuilder para concatenar números de 1 a 100, separados por vírgulas
- Construção de HTML: Use StringBuilder para construir uma lista não ordenada (ul/li)
- 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.



