Mutabilidade e encadeamento
Temos certeza de que você notou isso no exemplo anterior, mas o StringBuilder não é imutável. De fato, nós demos a ela 27 valores diferentes no exemplo (branco e a soma cada letra no alfabeto). O exame provavelmente tentará enganá-lo em relação a String e
StringBuilder sendo mutável.
Encadear torna isso ainda mais interessante. Quando encadeamos chamadas do método String, o resultado foi uma nova String com a resposta. Encadear objetos StringBuilder não funciona deste jeito. Em vez disso, o StringBuilder altera seu próprio estado e retorna uma referência para si mesmo!
Vejamos um exemplo para tornar isso mais claro:
4: StringBuilder sb = new StringBuilder("start");
5: sb.append("+middle"); // sb = "start+middle"
6: StringBuilder same = sb.append("+end"); // "start+middle+end"
A linha 5 adiciona texto ao final de sb. Também retorna uma referência ao sb, que é ignorado. Na linha 6 também adiciona texto ao final de sb e retorna uma referência a sb . Desta vez a referência é armazenada na same - o que significa sb e same ponto para o objeto exato same e imprimiria o valor de same.
O exame nem sempre facilita a leitura do código, tendo apenas um método por linha.
O que você acha que esse exemplo imprime?
4: StringBuilder a = new StringBuilder("abc");
5: StringBuilder b = a.append("de");
6: b = b.append("f").append("g");
7: System.out.println("a=" + a);
8: System.out.println("b=" + b);
Você disse que ambos imprimem "abcdefg"? Boa. Há apenas um objeto StringBuilder aqui. Sabemos disso porque o novo StringBuilder() foi chamado apenas uma vez. Na linha 5, há duas variáveis referentes a esse objeto, que tem um valor "abcde" . Na linha 6, aqueles duas variáveis ainda estão se referindo ao mesmo objeto, que agora tem um valor de "abcdefg". Aliás, a atribuição de volta para b não faz absolutamente nada. b já está apontando para esse StringBuilder.