Sobre Strings e StringBuilders

10 respostas
faeldix

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?

10 Respostas

flaviochess

Não procede!

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

G

NÂO!

rafadelnero
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.

faeldix

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

davidbuzatto

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).

public class Foo {

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

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

}
Compiled from "Foo.java"
public class Foo {
  public Foo();
    Code:
       0: aload_0       
       1: invokespecial #1                  // Method java/lang/Object."<init>":()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."<init>":()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        
}
B

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

davidbuzatto

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.

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…)

B

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

davidbuzatto

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…)

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

Criado 3 de janeiro de 2013
Ultima resposta 4 de jan. de 2013
Respostas 10
Participantes 6