Não, não exatamente.
Em primeiro lugar, há uma pequena diferença na semântica. Se a
for null
, então a.concat(b)
lança um NullPointerException
mas a+=b
tratará o valor original a
como se fosse null
. Além disso, o concat()
método aceita apenas String
valores 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 concat
método deve ser mais rápido. No entanto, com mais seqüências, o StringBuilder
método vence, pelo menos em termos de desempenho.
O código fonte String
e 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. javac
ainda 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 StringBuffer
có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 .