Java: A Classe StringBuilder


Essa sim é modificável, diferente da classe String.
Com strings dessa classe podemos usar as strings de forma dinâmica, criando, modificando, copiando, anexando, invertendo, adicionando e retirando caracteres, o tanto que desejarmos.

Porém, devemos ainda usar a classe String, especialmente quando os dados contidos na string não necessitarem de mudança (como em Labels, mensagens de erro, de log etc, pois por conta dessa limitação, essa classe é bem otimizada. Mas para strings que se alteram, usamos a StringBuilder.
Existe ainda a StringBuffer, para caso seja utilizado threads.

Vejamos alguns métodos e características destes:

StringBuilder teste = new StringBuilder("123456789");
teste.toString() -> retorna a string 123456789
teste.length() -> o tamanho é 9
teste.capacity() -> a capacidade inicial é 25 (9 + 16, toda StringBuilder inicia com 16, por padrão)
teste.ensureCapacity(100) -> garante uma capacidade pra string, para nao ser necessário crescer dinamicamente ao longo de um programa, o que pode comprometer a performance.
teste.setLength(5) -> agora, teste é somente "12345"
teste.reverse() -> inverte os caracteres da StringBuilder
teste.charAt(int) -> recebe um inteiro e retorna o caractere referente aquele índice
teste.getChars(a, b, char[] c, d) -> copia caracteres da StringBuilder 'teste' a partir do índice 'a' até o índice 'b' para o vetor de caracteres 'c', a partir do índice 'd' neste vetor.

Teste este método, passando a string para o vetor de caracteres e imprimindo-o:

teste.getChars(0, teste.length(), vetorChar, 0);
for( char caractere : vetorChar )
System.out.print(caractere); 

teste.setCharAt(a, 'b') -> insere o caractere 'b' na posição de índice 'a'
teste.insert(a, objeto) -> insere, a partir do índice 'a', o 'objeto' na BuildString. Objeto, em Java, representa uma gama enorme de coisas, como String, vetor de caracteres, booleanos, inteiros, float, doubles, chars etc. 
teste.deleteCharAt( a ) -> deleta especificamente o caractere da posição de índice 'a'
teste.delete(a, b) -> dele o caractere de índice 'a' até o de índice 'b'
teste.append( variosObjetos ) -> anexa, ao fim da String Builder 'teste' algum 'variosObjetos'; 

É possível, inclusive, a concatenação:
String teste2 = new StringBuilder().append("Programação").append("\n").append("Progressiva").toString();


 Com esses métodos, é possível notar a flexibilidade e utilidade da StringBuilder.