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 ?
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]
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.
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
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…