Dúvida questão SCJP: Quantidade de Objetos Strings Criados

10 respostas
ataufo

Quantos objetos String são criados abaixo e qual a saída.

String s1 = "spring ";

String s2 = s1 + "summer ";

s1.concat("fall ");

s2.concat(s1);

s1 += "winter ";

System.out.println(s1 + " " + s2);

Resposta: 8 Objetos / saída: spring winter spring summer

Dúvida: Eu contei 10 strings, com as Strings: " " e a string de saída “spring winter spring summer”. Porque não são contadas as strings que estão dentro de System.out.println() ??

Obrigado.

10 Respostas

taaqui

Isso ja foi amplamente discutido aqui no forum, da uma olhada nesses links.
http://www.guj.com.br/posts/list/116352.java
http://www.guj.com.br/posts/list/120952.java
http://www.guj.com.br/posts/list/15/125340.java

ataufo

OK, mas não responde a minha dúvida.

B

“Dê um peixe a um homem faminto e você o alimentará por um dia. Ensine-o a pescar, e você o estará alimentando pelo resto da vida.”

Se tiver a “paciência” de ler os topicos indicados, vai ver que tudo que é necessário saber sobre String Literals e Pool de String, está lá.

ataufo

Sinceramente eu já li todos os posts citados, e reli novamente agora. E continuo com a minha dúvida.

Pode ser que eu não tenha entendido, mas tudo que eu li nos posts correspondem com o conceito que eu já tinha sobre criação de Strings.

E não enxergo o motivo para a não criação no poll, para a String " " dentro do System.out.println.

douglas_vidotto

Eu acredito que a JVM não crie novos objetos String no Heap quando você executa o System.out.println(). Quando você chama esse método, acredito que a JVM simplesmente envie esses bytes passados como parâmetro para a saída padrão. Portanto, quando você faz: System.out.println(s1+ " "+ s2), a JVM busca os bytes da string s1, " " e s2 e envia todos para a saída, sem criar um objeto novo.

Não sei se falei bobagem, mas acho que é isso.

ataufo

Pois é douglas, é a unica explicação lógica que eu vejo também, mas nunca li isso em lugar nenhum…

Valeu.

M

ataufo:
Quantos objetos String são criados abaixo e qual a saída.

String s1 = "spring ";       <--- aqui Ele Cria uma String e Armazena na variavel s1, Total de Strings: 1

String s2 = s1 + "summer "; <-- aqui ele usa a variavel s1 ja criada Concatena com a variavel String  "summer" que vai se perder, e armazena na variavel s2
 Total de Strings: 3

s1.concat("fall "); <------- aqui ele cria uma variavel que vai se perder "fall " e concatena com outra variavel (s1), como médito concat não muda o estado da variavel, apenas retorna outra, Outra String criada e perdida  .              Total de Strings: 5

s2.concat(s1);  <-- aqui ele usa a variavel s2 pra concatenar com s1 ja criada, Criando outra String porém se perde tb pois não é salva .   Total de Strings: 6

s1 += "winter "; <-- Aqui ele cria a String "winter" contatena com a String s1, Criando outra String que sera armazenada na variavel s1. O antigo valor de s1 se perdeu nesse momento.           Total de Strings: 8

System.out.println(s1 + " " + s2);

M

m4rkk:
ataufo:
Quantos objetos String são criados abaixo e qual a saída.

String s1 = "spring ";       <--- aqui Ele Cria uma String e Armazena na variavel s1, Total de Strings: 1

String s2 = s1 + "summer "; <-- aqui ele usa a variavel s1 ja criada Concatena com a variavel String  "summer" que vai se perder, e armazena na variavel s2
 Total de Strings: 3

s1.concat("fall "); <------- aqui ele cria uma variavel que vai se perder "fall " e concatena com outra variavel (s1), como médito concat não muda o estado da variavel, apenas retorna outra, Outra String criada e perdida  .              Total de Strings: 5

s2.concat(s1);  <-- aqui ele usa a variavel s2 pra concatenar com s1 ja criada, Criando outra String porém se perde tb pois não é salva .   Total de Strings: 6

s1 += "winter "; <-- Aqui ele cria a String "winter" contatena com a String s1, Criando outra String que sera armazenada na variavel s1. O antigo valor de s1 se perdeu nesse momento.           Total de Strings: 8

System.out.println(s1 + " " + s2);

mas não era pra criar mais duas strings no println?

E

Esse tipo de questões, por serem um pouco questionáveis, não cai exatamente desse jeito como você viu nesse simulado.
É que na verdade as respostas são um pouco mais complicadas que parecem.
Por exemplo, eu consegui contar apenas 5, e isso considerando o println.

// s1 recebe uma string, que já está no pool
String s1 = "spring ";  
// A seguinte linha equivale a: s2 = (new StringBuilder (s1).append ("summer ")).toString(). 
// Isso cria 1 string, "spring summer ".
String s2 = s1 + "summer ";  
// A seguinte linha cria uma string "summer fall" que pode ser recolhida pela "garbage collection".  
s1.concat("fall ");  
// A seguinte linha cria uma string "spring summer spring ", que pode ser recolhida pela "garbage collection".
s2.concat(s1);  
// A seguinte linha equivale a: s1 = s1.concat ("winter "), que cria uma string "spring winter ").  
s1 += "winter ";  
// A seguinte linha equivale a: System.out.println ((new StringBuilder (s1).append (" ").append (s2)).toString()),
// que cria uma string "spring winter spring summer ".
System.out.println(s1 + " " + s2); 
// O total de strings criadas é 5. O total de objetos criados, não considerando os objetos "char[]" que são 
// criados internamente, é 7. Só que a sua questão indica 8 strings.
ricardo.ramalho

Edson Watanabe:
Esse tipo de questões, por serem um pouco questionáveis, não cai exatamente desse jeito como você viu nesse simulado.
É que na verdade as respostas são um pouco mais complicadas que parecem.
Por exemplo, eu consegui contar apenas 5, e isso considerando o println.

// s1 recebe uma string, que já está no pool String s1 = "spring "; // A seguinte linha equivale a: s2 = (new StringBuilder (s1).append ("summer ")).toString(). // Isso cria 1 string, "spring summer ". String s2 = s1 + "summer "; // A seguinte linha cria uma string "summer fall" que pode ser recolhida pela "garbage collection". s1.concat("fall "); // A seguinte linha cria uma string "spring summer spring ", que pode ser recolhida pela "garbage collection". s2.concat(s1); // A seguinte linha equivale a: s1 = s1.concat ("winter "), que cria uma string "spring winter "). s1 += "winter "; // A seguinte linha equivale a: System.out.println ((new StringBuilder (s1).append (" ").append (s2)).toString()), // que cria uma string "spring winter spring summer ". System.out.println(s1 + " " + s2); // O total de strings criadas é 5. O total de objetos criados, não considerando os objetos "char[]" que são // criados internamente, é 7. Só que a sua questão indica 8 strings.

No total ele realmente cria 8 objetos strings na memória, no caso tanto “summer” quanto “winter” são objetos independentes, mas como ñ foram referenciados para nenhuma variavel ficaram perdidos na memória. O código abaixo tem o mesmo efeito, mas fica mais fácil visualizar que realmente se trata de um objeto

String s1 = s1 + new String("summer");

Isso não se aplica para o que é criado no System.out.println() pq ele já envia para o console sem passar pela memória

Alguém me corrija se eu estiver enganado

Criado 29 de agosto de 2009
Ultima resposta 18 de set. de 2009
Respostas 10
Participantes 8