Dúvida exercício testkiller[Resolvido]

11. public String makinStrings() {
12. String s = "Fred";
13. s = s + "47";
14. s = s.substring(2, 5);
15. s = s.toUpperCase();
16. return s.toString();
17. }

How many String objects will be created when this method is invoked?
A. 1
B. 2
C. 3
D. 4
E. 5
F. 6

De acordo com o testkiller a resposta é a “C”. Mas estou em dúvida.

Eu enxergava da seguinte forma:
Na linha 12 já temos um “objeto”;
Na linha 13 temos mais 2, o “47” e o novo resultando da concatenação (s + “47”)
Na linha 14 um novo objeto criado "com algumas partes da string"
Na linha 15 um novo objeto criado “Em caixa alta”

Resumindo, na eu vejo 5 objetos strings criados. :?: :?:

Eu crieo que a resposta correta é 5 mesmo.
Qual testKiller você pegou?

Então, eu tenho duas versões. Estou estudando a 1ª delas V5.

Bom cara, eu fiz esse teste aqui…

[code]class Teste {
public static void main(String args []) {
String s = “Fred”;
System.out.println(s.hashCode());

	s = s + "47";
	System.out.println(s.hashCode());

	s = s.substring(2, 5);
	System.out.println(s.hashCode());

	s = s.toUpperCase();
	System.out.println(s.hashCode());
	//return s.toString();	
}

}[/code]

Resultado:
2198155
2112428622
100213
68469

Deram quatro hash diferentes… Não sei se o teste é esse mesmo.

gabrielmskate

faltou o hash da string “47”

[quote=robinsonbsilva] 11. public String makinStrings() { 12. String s = "Fred"; 13. s = s + "47"; 14. s = s.substring(2, 5); 15. s = s.toUpperCase(); 16. return s.toString(); 17. }

How many String objects will be created when this method is invoked?
A. 1
B. 2
C. 3
D. 4
E. 5
F. 6

De acordo com o testkiller a resposta é a “C”. Mas estou em dúvida.

Eu enxergava da seguinte forma:
Na linha 12 já temos um “objeto”;
Na linha 13 temos mais 2, o “47” e o novo resultando da concatenação (s + “47”)
Na linha 14 um novo objeto criado "com algumas partes da string"
Na linha 15 um novo objeto criado “Em caixa alta”

Resumindo, na eu vejo 5 objetos strings criados. :?: :?:[/quote]

Ta certo,

  1. String s = “Fred”; aqui tem 1 objeto { s }
  2. s = s + “47”; aqui tem 2 { “47” e o resultado da contatenação }

3 objetos criados

[quote=alisonrodrigues][quote=robinsonbsilva] 11. public String makinStrings() { 12. String s = "Fred"; 13. s = s + "47"; 14. s = s.substring(2, 5); 15. s = s.toUpperCase(); 16. return s.toString(); 17. }

How many String objects will be created when this method is invoked?
A. 1
B. 2
C. 3
D. 4
E. 5
F. 6

De acordo com o testkiller a resposta é a “C”. Mas estou em dúvida.

Eu enxergava da seguinte forma:
Na linha 12 já temos um “objeto”;
Na linha 13 temos mais 2, o “47” e o novo resultando da concatenação (s + “47”)
Na linha 14 um novo objeto criado "com algumas partes da string"
Na linha 15 um novo objeto criado “Em caixa alta”

Resumindo, na eu vejo 5 objetos strings criados. :?: :?:[/quote]

Ta certo,

  1. String s = “Fred”; aqui tem 1 objeto { s }
  2. s = s + “47”; aqui tem 2 { “47” e o resultado da contatenação }

3 objetos criados
[/quote]

Ora, e subtstring e toUpperCase ? Também não criam novos objetos ?

Até onde eu sei não, contatenações com string sim, se usar StringBuffer ou StringBuilder não cria novos objetos.

No eu jurava que era criado “1” objeto somente, e a cada linha ele mudava o valor desse objeto.

É senhores, se tratando de “String” é isso mesmo. “Cinco objetos criados” (Objetos String’s são imutáveis)

Strings são imutáveis…

Mas voltando ao assunto, tem uma explicação longa em outro tópico: http://www.guj.com.br/posts/list/125340.java

robson agora vc me ajudou rs, como objetos Strings são imutaveis ao inves de mudar o seu conteudo ele cria um novo objeto.

Mas pelo que eu estou entendendo (pelas pequisas no goolge e aqui no GUJ), “Fred” e “47” são criadas no pool de String antes do programa rodar. E não são objetos novos.

Sendo assim eu mudo minha opinião, e acho que são 3 objetos.

gabriel eu olhei tb, no link que vc mostrou ai, realmente são 3.

Boa tarde senhores,

Me perdoem pelo tópico “duplicado”, tem uma mesma thread idêntica. :oops:

So para concluir o pensamento. De acordo com o livro SCJP, quando o compilador encontra uma String literal, verifica no pool para ver se já existe, caso sim, a referencia apontará para ela sem criar um novo objeto String