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?
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