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() ??
“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
m4rkk
ataufo:
Quantos objetos String são criados abaixo e qual a saída.
mas não era pra criar mais duas strings no println?
E
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 poolStrings1="spring ";// A seguinte linha equivale a: s2 = (new StringBuilder (s1).append ("summer ")).toString(). // Isso cria 1 string, "spring summer ".Strings2=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
Strings1=s1+newString("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