Questão 91 do Testkiller

public String makinStrings() {
String s = “Fred”;
s = s + “47”;
s = s.substring(2,5);
s = s.toUpperCase();
return s.toString();
}

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

Answer: C

No livro da Kathy Sierra na página 433 fala sobre esse mesmo tipo de criação de objetos String, e para mim a resposta é [color=green]5[/color], seguindo as mesmas idéias do livro… ou o livro está errado ou a questão, alguém sabe me dizer ?

agradeço desde já ! =)

[quote=brrodo em 29/04/2009][quote=brrodo em 16/03/2009][quote=brrodo em 28/01/2009]Essa questão já foi AMPLAMENTE discutida nestes tópicos abaixo:

http://www.guj.com.br/posts/list/120952.java
http://www.guj.com.br/posts/list/116352.java

Essa questão reaparece no fórum sempre, de tempos em tempos, e SEMPRE gera uma grande discussão. Então vamos aproveitar as que já foram sanadas, pra não ficar repetitivo.[/quote][/quote][/quote]

:wink:

Quando uma classe é iniciada ela pega e guarda todas as referências.

Ex: String a = “b”;

Quando a classe roda ela pega isso …

Dai depois é só ver a pergunta e responder!!

Quantos objetos são criados quando o “METODO” é invocado!!

s = s + “47”;
s = s.substring(2,5);
s = s.toUpperCase();

3

to string não ta criando objeto!!

Abraço!

Não entendi a sua resposta, Gabriel.

Qualquer literal de String é um objeto que é jogado no pool. Assim como os metodos substr e substring retornam uma String, essas strings também são objetos.

A resposta para mim também é cinco.

[quote=AUser]Não entendi a sua resposta, Gabriel.

Qualquer literal de String é um objeto que é jogado no pool. Assim como os metodos substr e substring retornam uma String, essas strings também são objetos.

A resposta para mim também é cinco.

[/quote]

atenha-se a pergunta

How many String objects will be created when this method is invoked?

Traduzindo:
“quantas objets strings são criados no momento em que o método é invocado ?”

no momento em que o método é invocado apenas 3 strings são criadas…

as Strings literias, “47” e “Fred” são criadas quando a classe é carregada pela JVM (e isso somente se anteriormente no pool de strings não exista strings com valor “47” ou “Fred”), portanto essas literias não são criadas quando o método é invocado, e é assim que o pool de strings é montado… ele é otimizado assim…

esse método que tem essa referencia literal, passa a apontar para refencias dessas duas strings que estão no pool de strings, e não cria novas strings ao passar pelo método

Pra mim a resposta é 4

Se vc colocar este código e depurar, será criado um id diferente para cada objeto
na execução dos códigos

String s = "Fred"; 
s = s + "47"; 
s = s.substring(2,5); 
s = s.toUpperCase();

return s.toString(), não cria nenhum objeto… só retorna o atual.

o uso do pool de Strings seria algo do tipo:

String s1 = "teste" String s2 = "teste"

Os dois objetos apontam para o mesmo lugar e tem o mesmo identificador de objeto. por isso é usado o pool… isso é economia de memória no Java

[quote=sandeco]Pra mim a resposta é 4

Se vc colocar este código e depurar, será criado um id diferente para cada objeto
na execução dos códigos

String s = "Fred"; 
s = s + "47"; 
s = s.substring(2,5); 
s = s.toUpperCase();

return s.toString(), não cria nenhum objeto… só retorna o atual.

o uso do pool de Strings seria algo do tipo:

String s1 = "teste" String s2 = "teste"

Os dois objetos apontam para o mesmo lugar e tem o mesmo identificador de objeto. por isso é usado o pool… isso é economia de memória no Java
[/quote]

primeiro que c não ta nem contando direito hehehe… se contar com as strings do poll então seriam 5 strings… “Fred”, “47”, “Fred47”, “ed4”, “ED4”

E o fato é que vc deve ler a pergunta, que é, quantos objetos são criados quando o método é EXECUTADO, e as strings literais NÃO são criadas quando o método é executado, os literias são criados quando a classe que as contém é carregada na JVM, e não no momento da passagem no método… e nem garantias de que as literias são criados por esta classe é possivle ter, pois ela pode já esta carregada por outro classe que as continha previamente…

http://www.guj.com.br/posts/list/116352.java e não se fala mais nisso.