Duvida sobre Pool de String (TestKiller)

15 respostas
rafael_souza0

Galera, estou com uma dúvida com relação à uma questão do TestKiller

public String makinStrings() {
   String s = "Fred"; //line 1
   s = s + "47"; //line 2
   s = s.substring(2, 5); //line 3
   s = s.toUpperCase(); //line 4
   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

A resposta dessa questão, segundo o TestKiller é C, porém se partirmos do princípio que Objetos Strings são imutáveis, acredito que a resposta seria 4,
pois na linha 1, 2, 3 e 4 é criado objetos Strings e atribuido a variável “s”.

O que vocês acham?

15 Respostas

mauricioadl

concordo com voce.

rmendes08

A questão é clara quanto ao momento da criação das String’s. Ela quer saber quantas Strings são criadas quando o método invocado, e de fato, a resposta é 3 String’s.

2 String’s são criadas na compilação: “Fred” e “47”. Quando o método é invocado são criadas mais 3:

s + "47" // "47" já existia antes do método ser invocado
s.substring(2,5)
s.toUpperCase()
InsaneChess

Cara, eu não tenho certeza.
Se me lembro bem essa é a questão 91 do TestKiller…que está com a pergunta errada.
Se não me engano ela quer saber quantos objetos estão disponiveis para a coleta de lixo…

Só pra confirmar da uma pesquisada no fórum sobre isso, que já tem alguns tópicos.

rafael_souza0

Vou procurar.

De qualquer forma, obrigado :smiley:

Henrique.tenorio

Realmente são 4 objetos. Eu tambem estou estudando para a certificação e tive esta duvida pelo que pesquisei a pergunta esta errada mesma.

sidney.tavares

Olá a todos, desculpem postar neste tópico, mas para mim não ficou claro, eu achei a questão interessante, então copiei o código e executei, na minha modesta opinião acredito que a resposta correta seja mesmo 3 objetos, mas contrariando a resposta dada pelo amigo rmendes08, acredito que a linha:

s = s.toUpperCase();

Não cria um novo objeto, apenas passa o objeto criado na linha anterior para letras maiúsculas, se estiver errado por favor me corrijam, mas acredito que seja isso mesmo. Abraços.

asousaj

sidney.tavares:
Olá a todos, desculpem postar neste tópico, mas para mim não ficou claro, eu achei a questão interessante, então copiei o código e executei, na minha modesta opinião acredito que a resposta correta seja mesmo 3 objetos, mas contrariando a resposta dada pelo amigo rmendes08, acredito que a linha:

s = s.toUpperCase();

Não cria um novo objeto, apenas passa o objeto criado na linha anterior para letras maiúsculas, se estiver errado por favor me corrijam, mas acredito que seja isso mesmo. Abraços.

Lembre-se Strings são imutaveis, logo foi criada uma nova String com as letras em maiusculas.

sidney.tavares

asousaj,
Então sendo dessa forma a resposta correta seria 4 objetos String? Valeu pela resposta.

Henrique.tenorio

asousaj:
sidney.tavares:
Olá a todos, desculpem postar neste tópico, mas para mim não ficou claro, eu achei a questão interessante, então copiei o código e executei, na minha modesta opinião acredito que a resposta correta seja mesmo 3 objetos, mas contrariando a resposta dada pelo amigo rmendes08, acredito que a linha:

s = s.toUpperCase();

Não cria um novo objeto, apenas passa o objeto criado na linha anterior para letras maiúsculas, se estiver errado por favor me corrijam, mas acredito que seja isso mesmo. Abraços.

Lembre-se Strings são imutaveis, logo foi criada uma nova String com as letras em maiusculas.

Então na realidade temos 5, pois

cria 2 novos objetos o “47” é um, e o (s+“47”) representa outro.

E

http://www.guj.com.br/java/116352-duvida-na-quantidade-de-strings-criadas-resolvido

De qualquer maneira, essa é uma das questões mais perguntadas (e com menor probabilidade de cair na prova de verdade) aqui do GUJ.
Olhem os resultados da consulta no Google:

http://www.google.com.br/search?q=fred+47+testkiller+site%3Awww.guj.com.br&safe=active

asousaj

Valew a resposta entanglement,
então são realmente 3.

Pra quem tem o livro da kathy Sierra (Java 6 ingles), da uma olhadinha no capitulo 6, página 433/434.
“Important Facts About Strings and Memory”

Henrique.tenorio

3 o cacete!

asousaj

“Fred” e “47” já existiam no pool antes do método ser invocado.
Pergunta é quantas são criadas ao se invocar o método. 3.

Da pra provar isso via IDE(eclipse ou netbeans)? Não achei como.

Abç a tds!

Henrique.tenorio

“Fred” e “47” já existiam no pool antes do método ser invocado.
Pergunta é quantas são criadas ao se invocar o método. 3.

Da pra provar isso via IDE(eclipse ou netbeans)? Não achei como.

Abç a tds!

Só reformulando a pergunta então. Ao final da execução do método quantos objetos foram criados?

Henrique.tenorio

Fatos Importantes Relacionados aos Objetos String e a Memória

Um dos objetivos principais de qualquer linguagem de programação sofisticada é fazer uso eficiente da memória.
Com o crescimento dos aplicativos, é muito comum que Strings literais ocupem grandes espaços da memória, e que
geralmente haja muita redundância dentro do universo das Strings literais de um programa. Para tornar a linguagem
Java mais eficiente no uso da memória, a JVM deixa reservada um área especial chamada “pool constante de Strings”.
Quando o compilador encontra uma String literal, verifica o pool para ver se já existe uma idêntica. Se uma coincidência
for encontrada, a referência ao novo valor literal será direcionada para a String existente e nenhum objeto String literal
novo será criado (a String existente simplesmente terá uma referência adicional). Agora podemos começar a ver por que
tornar objetos String imutáveis é uma ideia tão boa. Se diversas variáveis de referência apontam para a mesma String
sem nem mesmo terem informação disso, seria muito ruim se alguma delas pudesse ter o valor da string alterado.

Esta é a citação do livro. Mesmo assim não consigo entender a pergunta.

Criado 28 de setembro de 2011
Ultima resposta 24 de nov. de 2011
Respostas 15
Participantes 8