Sobre Strings e StringBuilders

segue o codigo:

String s = "Hello"; s = s + "78";

estava conversando com um amigo meu, e ele jurou que o s na segunda linha era agora um StringBuilder.
Procede a informação?

Não procede!

Veja bem, não faz sentido um objeto sofrer uma mutação assim, sem nenhum cast (conversão).

NÂO!

String s = "Hello";  
s = s + "78"; 

Nesse caso a String foi somente concatenada gerando outro objeto String no Heap!

StringBuilder é outra classe usada para obter melhor performance na manipulação de Strings, e essa nem foi declarada.

ele acabou de me mandar esse topico aqui pra provar o que disse:

http://www.guj.com.br/java/116352-duvida-na-quantidade-de-strings-criadas-resolvido

Não sei o que o seu colega quis dizer com “é um StringBuilder”.
Se ele está falando o que é internamente (bytecode), sim, é um StringBuilder.

Veja a classe abaixo e o bytecode dela (gerado usando o javap com o comando => javap -c Foo.class).
Faltou falar que gerei usando o compilador do Java 7 (1.7.0_17).

[code]public class Foo {

public void fooString() {
    String s = "bar";
}

public void fooStringBuilder() {
    String s = "bar s?";
    s = s + " foo!";
}

}
[/code]

[code]Compiled from “Foo.java"
public class Foo {
public Foo();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object.”":()V
4: return

public void fooString();
Code:
0: ldc #2 // String bar
2: astore_1
3: return

public void fooStringBuilder();
Code:
0: ldc #3 // String bar s?
2: astore_1
3: new #4 // class java/lang/StringBuilder
6: dup
7: invokespecial #5 // Method java/lang/StringBuilder."":()V
10: aload_1
11: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
14: ldc #7 // String foo!
16: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
19: invokevirtual #8 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
22: astore_1
23: return
}[/code]

Acredito que seu colega quis dizer com “é um StringBuilder” é que a classe String implementa a classe StringBuilder para a concatenação.
Para cada concatenação desta forma:

É gerado um novo objeto String, utilizando StringBuilder:

StringBuffer buffer = new StringBuffer(); buffer.append("78"); String s = buffer.toString();

http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/String.html

Isso não acontece. A classe String não “implementa” a classe StringBuilder. Nada a ver.
O compilador gera código usando a classe StringBuilder, é isso que acontece.

excelente davidbuzatto…

se caisse uma questão dessas na prova OCJP5, qual seria a resposta da seguinte pergunta:

“Quantas STRINGS são criadas no exemplo?” (use o exemplo que eu postei acima…)

Talvez eu tenha me expressado mal…

Na verdade quis dizer que a forma de concatenação da classe String é feita através da classe StringBuilder, pelo metodo append!!!

[quote=faeldix]excelente davidbuzatto…

se caisse uma questão dessas na prova OCJP5, qual seria a resposta da seguinte pergunta:

“Quantas STRINGS são criadas no exemplo?” (use o exemplo que eu postei acima…)[/quote]

Na OCJP5 responda como se você não conhecesse esses detalhes internos.
Para o seu exemplo, a resposta é 3 Strings: “Hello”, “78” e “Hello78”.

[]'s