Não, não exatamente.
Em primeiro lugar, há uma pequena diferença na semântica. Se afor null, então a.concat(b)lança um NullPointerExceptionmas a+=btratará o valor original acomo se fosse null. Além disso, o concat()método aceita apenas Stringvalores enquanto o +operador silenciosamente converte o argumento em uma String (usando o toString()método para objetos). Portanto, o concat()método é mais rigoroso no que aceita.
Para olhar por baixo do capô, escreva uma classe simples com a += b;
public class Concat {
String cat(String a, String b) {
a += b;
return a;
}
}
Agora desmonte com javap -c(incluído no Sun JDK). Você deve ver uma listagem incluindo:
java.lang.String cat(java.lang.String, java.lang.String);
Code:
0: new #2; //class java/lang/StringBuilder
3: dup
4: invokespecial #3; //Method java/lang/StringBuilder."<init>":()V
7: aload_1
8: invokevirtual #4; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
11: aload_2
12: invokevirtual #4; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
15: invokevirtual #5; //Method java/lang/StringBuilder.toString:()Ljava/lang/ String;
18: astore_1
19: aload_1
20: areturn
Então, a += bé o equivalente a
a = new StringBuilder()
.append(a)
.append(b)
.toString();
O concatmétodo deve ser mais rápido. No entanto, com mais seqüências, o StringBuildermétodo vence, pelo menos em termos de desempenho.
O código fonte Stringe StringBuilder(e sua classe base privada do pacote) está disponível no src.zip do Sun JDK. Você pode ver que está construindo uma matriz de caracteres (redimensionando conforme necessário) e depois descartando-a quando cria a final String. Na prática, a alocação de memória é surpreendentemente rápida.
Atualização: Como observa Pawel Adamski, o desempenho mudou no HotSpot mais recente. javacainda produz exatamente o mesmo código, mas o compilador de bytecode engana. O teste simples falha completamente porque todo o corpo do código é jogado fora. A soma System.identityHashCode(não String.hashCode) mostra que o StringBuffercódigo tem uma pequena vantagem. Sujeito a alterações quando a próxima atualização for lançada ou se você usar uma JVM diferente. Em @lukaseder , uma lista de intrínsecas do HotSpot JVM .