Código ruim:

StringBuffer sb = new StringBuffer();
sb.append("Nome: ");
sb.append(nome + '\\n');
sb.append("!");
String s = sb.toString();

Este código parece otimizado, mas ele não está. Para otimizar, você deve fazer todo da maneira correta, se não vai tudo por água abaixo! O erro mais óbvio é a concatenação de String na linha 3. Na linha 4, adicionar um char pode ser mais rápido do que adicionar uma String. Faltou também informar o tamanho do buffer na sua criação, omissão que pode levar redimensionamentos desnecessários (o que implica em cópia de array). A partir do JDK 1.5, um StringBuilder deve ser usado em vez do StringBuffer: como é apenas uma variável local, a sincronização implícita no uso do StringBuffer é exagero. Na verdade, usar uma simples concatenação de String compila para um quase perfeito byte code: apenas faltando o tamanho do buffer.

Código bom:

StringBuilder sb =
      new StringBuilder(100);
sb.append("Nome: ");
sb.append(nome);
sb.append("\\n!");
String s = sb.toString();

Código simples não necessariamente ruim:

String s = "Nome: " + nome + "\\n!";