Objetos no heap

10 respostas
M

Estou fazendo um simulado e deparei com esse código:

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

a resposta do simulado é C, mas eu acho que está errado. Eu acredito que os seguintes objetos serão criados:

Fred
47
Fred47
ed4
ED4

acho que a resposta são 5 objetos, estou certo ou errado?

10 Respostas

Paulo_Silveira

pra mim sao 4. o toString da String devolve this.

ele provavelmente esta considerando que “Fred” é uma constante e esta no pool de constante. mas ai a pergunta ja ficou muito dificil e estranha. nao cai este tipo de pergunta ambigua

cv1

Mais ambiguo ainda eh o “when”, pq se vc considerar quantos objetos sobraram apos chamar o metodo, so ficam dois (“Fred” no pool e “ED4” no retorno).

LPJava

http://www.guj.com.br/posts/list/50115.java

ViniGodoy

Eu concordo com você…

A menos que, como o pessoal já falou, ele esteja considerando “47” e “Fred” Strings que já estejam no pool e, se estiverem, elas serão somente usadas de lá e não criadas.

T
public String makinStrings() {

    String s = "Fred"; // "Fred" está no pool
    s = s + "47"; // "47" está no pool; criada a string "Fred47"
    s = s.substring(2, 5); // criada a string "ed4"
    s = s.toUpperCase(); // criada a string "ED4"
    return s.toString(); // não foi criada string nenhuma aqui, já que toString() simplesmente retorna "this"
}

A resposta é 3 (strings criadas durante a execução do método), mas persistirá após a execução do método apenas uma string (já que “Fred” e “47” já estão no pool), que é o valor “ED4”.

Seria mais cabuloso se ele perguntasse quantos OBJETOS serão criados. Neste caso:

public String makinStrings() {

    String s = "Fred"; // "Fred" está no pool
    s = s + "47"; // isto equivale a:
/*
    StringBuilder tmp = new StringBuilder(s); // criado 1 StringBuilder e 1 char[]
    tmp.append ("47"); // pode ser que seja criado um novo char[] ou não, dependendo do tamanho original do char[]
    s = tmp.toString(); // criado 1 String e 1 char[] contendo uma cópia do char[] do StringBuilder original
*/
    s = s.substring(2, 5); // criada a string "ed4". Note que o char[] é reaproveitado da string original. 
    s = s.toUpperCase(); // criada a string "ED4". Neste caso também é criada um novo char[], pois o conteúdo é novo.
    return s.toString(); // não foi criada string nenhuma aqui, já que toString() simplesmente retorna "this"
}

Isso cria a incrível quantidade de 7 ou 8 objetos. Mas isso não se pergunta em provas, porque é um detalhe de implementação.

maior_abandonado

bom…antes de tudo eu peço desculpa se seria melhor cria um novo tópico com a mesma duvida e a mesma questão se ja existe um antigo…

bom…meu inglês é fraquinho mais se eu intendi direiro, pergunta quantos objetos do tipo String são criados ao se chamar esse metodo…

considerando que “Fred” e “47” estão no pool são 3… mais a pergunta não especifica que foi criada uma string “Fred” anteriormente, então deduzi que seria criada ai na linha 4 essa string, e então ela mesma estaria no pool de strings…

alguém ai me explica por favor, pq q as strings “Fred” e “42” ja estão no pool, não sendo criadas?? isso q eu não intendi…

PadrE

Opa,

Vou arriscar uma repsosta !!!

Elas ficam no pool porque são constantes com valores já definidos… ou seja, a JVM saca que esses caras nunca serão alterados portanto os joga dentro do pool…

Só não tenho certeza do momento que isso ocorre… se eh qndo o programa eh executado ou quando o método for chamado.

Fui !

maior_abandonado

dexa eu ver se eu intendi…

quando o programa é carregado, ou quando o metodo é carregado, sei la, a jvm coloca essas strings no pool antes mesmo de terem sido criadas no código???

sempre q eu coloca o codigo em um método qualquer String var = "qualquer coisa", a JVM vai criar “qualquer coisa” no pool antes mesmo de chegar na linha que eu faço isso, e então ao chegar enssa linha ela vai aproveita a variavel presente no pool criada anteriormente por ela propria?

é isso mesmo?

PadrE

Opa…

Pra ter certeza seria legal olhar o visualvm, criar uma classe bem simples com algumas variaveis String sem uso e ver o que rola no heap…

Fiz um teste aki com JFrame mas não deu muito certo… tem muuuiiiita classe e String em memória e fica dificil achar as frases que criei… (podia ter um busca nesse visualvm pelo value neh ??)

Quando executei o programa todas as String’s de rótulos foram pro heap… (achei qse todas ^^)

Criei um método sem chamada com algumas variaveis texto dentro… mas esses valores não achei no heap, agora não sei se não achei porque parei de procurar depois de [telefone removido] classes ou se se realmente não foram carregados… ^^

Pra mim, ele é carregado no momento em que a classe for instanciada e fica la até o fim do programa… independente se o código que cria a String foi executado ou não. (o que justificaria a reposta da questão)

Fui !!!

maior_abandonado

cara valeu ai as dicas… vo cria classe aki basicona, sem herança nenhuma exceto object e sem interface grafica, pra tenta não ter os mesmos problemas…

dei uma googadiha de 1 minuto aki pq to indo almoçar sobre o visualvm, depois doalmoço euvo baixa e tentar usa-lo…obrigadão…

vlw mesmo kra…

Criado 27 de junho de 2007
Ultima resposta 6 de jan. de 2009
Respostas 10
Participantes 8