| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 19/03/2009 16:50:36
|
brrodo
JavaTeenager
Membro desde: 07/02/2009 23:31:16
Mensagens: 173
Offline
|
jbjares wrote:Caro brrodo,
Quero só que você me diga de onde tirou esta informação??
Citando brrodo:
Entenda q o pool de strings é populado ANTES do código ser executado...As únicas strings literais existentes até este ponto são:
"fred"
"marcos"
" silva"
O intuito do pool é otimizar o desempenho da JVM, da seguinte maneira:
Varrer o código e separar todas as literais declaradas e checar se, por exemplo, existem 2 ou mais string literais "fred" declaradas no código (como no caso q vc citou), se houver, apenas uma string será coloada no pool e todas as referências apontarão pra ela. É uma maneira de "poupar" memória.
No caso do String.concat(), se puder olhar na documentação verá q ela retorna um objeto String.
Como disse anteriormente, eu jamais lí nada parecido em lugar algum. Quer dizer que a Maquina Virutal tem uma espécie de Thread (serviço) que fica varrendo o código o tempo todo para encontrar "literais" e coloca-los no pool? Cara se vocẽ me disser em que lugar da especificação posso encontrar isso, eu realmente terei que rever meus conceitos.
Tentei ser o mais simples possível para q o funcionamento PRÁTICO do "mecanismo" fosse entendido.
Se for no post q citei onde há uma discussão sobre pool de Strings (http://www.guj.com.br/posts/list/116352.java), verá q esta informação é repassada por mais usuários e moderadores.
O próprio livro da Kathy o explica de forma superficial. Além de fontes citadas em fóruns como o JavaRanch. Ou seja, vc poderá encontrar fontes oficiais q o confirmem facilmente se procurar.
Acho q está havendo muitas discordâncias sobre o assunto, e com todo respeito, jbjares, devo lhe dizer q sua conclusão de 7 objetos criados no código acima, está equivocada. Não q a JLS esteja errada, mas acho q sua interpretação do conteúdo lá presente talvez tenha sido feita de maneira incorreta.
Prefiro então deixar q daqui pra frente algum moderador (ou quem estiver disposto) assuma o rumo do tópico pra evitar discordâncias dessa natureza.
This message was edited 2 times. Last update was at 19/03/2009 16:55:02
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 19/03/2009 16:55:56
|
jbjares
JavaChild
![[Avatar]](/images/avatar/17d079a0102e73dbd8c7cd98b6716b5b.png)
Membro desde: 19/10/2006 18:51:13
Mensagens: 103
Offline
|
Caro thingol,
Onde consigo esta informação? Quero de uma vez por todas fechar este assunto e deixar meu entendimento neste tema redondo, mas eu preciso de fontes. Vocẽ tem?
Citando thingol:
Quando a JVM carrega uma classe, ela inspeciona as constantes strings que estão definidas no código dessa classe e as "interna" no pool.
Abraço.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 19/03/2009 17:03:56
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
a) Quando a classe que contém este código for carregada, então a JVM irá verificar que há as seguintes constantes string: "fred", "marcos" e " silva", irá criar um objeto String para cada uma dessas constantes, e irá internar esses tais objetos no pool de strings. Isso, nas questões de provas, não conta como criação de objetos, porque nas provas pergunta-se qual é o número de objetos criados DENTRO do método.
b) Linha 2 - a variável s1 recebe uma referência para o objeto String "fred" que já está no pool. Criados ZERO objetos.
c) Linha 3 - o construtor de String recebe uma referência para o objeto String "marcos" e CRIA UMA NOVA STRING. s2 recebe uma referência para essa nova string. Criado UM objeto (sem contar o objeto char[] que todo objeto String referencia.)
d) Linha 4 - análogo à linha 3. Criado UM objeto.
e) Linha 5 - O método "concat" da classe String, chamado sobre o objeto String contendo o valor "fred", recebe uma referência para o objeto String " silva", cria um StringBuilder, copia os caracteres contidos nela mesma ("fred"), copia os caracteres contidos no parâmetro (" silva"), e a seguir chama o método toString da classe StringBuilder, o que como resultado líquido CRIA UMA NOVA STRING com o conteúdo "fred silva". Então essa nova string é atribuída à variável s1, que por sua vez perde referência à string "fred". Portanto: criado UM objeto. (as questões normalmente só contam o número de objetos líquidos, não os objetos temporários criados pelos métodos).
f) Linha 6 - a variável s4 recebe uma referência ao objeto "fred silva" que também é referido por s1. Criados ZERO objetos.
Portanto foram criados 3 objetos.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 19/03/2009 17:07:05
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
jbjares wrote:Caro thingol,
Onde consigo esta informação? Quero de uma vez por todas fechar este assunto e deixar meu entendimento neste tema redondo, mas eu preciso de fontes. Vocẽ tem?
Citando thingol:
Quando a JVM carrega uma classe, ela inspeciona as constantes strings que estão definidas no código dessa classe e as "interna" no pool.
Abraço.
http://java.sun.com/docs/books/jvms/second_edition/html/ConstantPool.doc.html
Cuidado: está escrito em língua de advogado. Não espere entender tudo numa primeira lida.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 19/03/2009 17:20:13
|
taaqui
JavaEvangelist
![[Avatar]](/images/avatar/13b96a16c5db9bc9de8f05b6f74a5d96.jpg)
Membro desde: 05/02/2008 12:25:07
Mensagens: 300
Localização: Rio de Janeiro
Offline
|
thingol wrote:
a) Quando a classe que contém este código for carregada, então a JVM irá verificar que há as seguintes constantes string: "fred", "marcos" e " silva", irá criar um objeto String para cada uma dessas constantes, e irá internar esses tais objetos no pool de strings. Isso, nas questões de provas, não conta como criação de objetos, porque nas provas pergunta-se qual é o número de objetos criados DENTRO do método.
b) Linha 2 - a variável s1 recebe uma referência para o objeto String "fred" que já está no pool. Criados ZERO objetos.
c) Linha 3 - o construtor de String recebe uma referência para o objeto String "marcos" e CRIA UMA NOVA STRING. s2 recebe uma referência para essa nova string. Criado UM objeto (sem contar o objeto char[] que todo objeto String referencia.)
d) Linha 4 - análogo à linha 3. Criado UM objeto.
e) Linha 5 - O método "concat" da classe String, chamado sobre o objeto String contendo o valor "fred", recebe uma referência para o objeto String " silva", cria um StringBuilder, copia os caracteres contidos nela mesma ("fred"), copia os caracteres contidos no parâmetro (" silva"), e a seguir chama o método toString da classe StringBuilder, o que como resultado líquido CRIA UMA NOVA STRING com o conteúdo "fred silva". Então essa nova string é atribuída à variável s1, que por sua vez perde referência à string "fred". Portanto: criado UM objeto. (as questões normalmente só contam o número de objetos líquidos, não os objetos temporários criados pelos métodos).
f) Linha 6 - a variável s4 recebe uma referência ao objeto "fred silva" que também é referido por s1. Criados ZERO objetos.
Portanto foram criados 3 objetos.
Isso,quase igual a minha explicação de cima^^,
s1 = s1.concat(" silva"); tinha esquecido que criava um objeto..
que bom que foi tudo resolvido...^^
sonhar custa nada...
This message was edited 2 times. Last update was at 19/03/2009 17:23:50
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 19/03/2009 19:38:11
|
jbjares
JavaChild
![[Avatar]](/images/avatar/17d079a0102e73dbd8c7cd98b6716b5b.png)
Membro desde: 19/10/2006 18:51:13
Mensagens: 103
Offline
|
Olá Pessoal,
Muito boa sua explicação thingol. Agooora SIM! Podemos todos durmir felizes AUhuHAUhAUHUah
Lí a especificação que você passou e realmente agora tudo faz sentido. Agradeço aos amigos brrodo e taaqui pela participação e apoio, batemos bastante a cabeça mas valeu a pena.
Abraço.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 19/03/2009 20:36:42
|
omaisnormalbaba
JavaGuru
Membro desde: 27/03/2006 18:45:11
Mensagens: 223
Localização: Passos - Mg
Offline
|
Amigos.
Com base nessa discussao amigavel que nós estamos tento eu andei procurando com mais calma aqui na minha casa e encontrei várias respostas a respeito do velho assunto que ja ate se popularizou no javarunch de nome (Fred47)...heheheeh..
Com base nos links que encontrei e as respostas do pessoal eu tive a minha conclusão.
Primeiramente : A pergunta é : Quantos objetos são criados no momento da execução desse método?
Quando uma classe é carregada e COMPILADA as String's literais são criadas dentro do pool de constantes Strings, isso para economizar memoria isso em tempo de compilação.
Quando o método é chamado (EXECUTADO) a String literal ja se encontra no pool e não é criado nenhum OBJETO. Ou seja, todas as String's literais em tempo de compilação são criadas e armazenadas no poll de constantes.
Com base nessas afirmações os unicos OBJETOS criados durante a EXECUÇÃO do método são:
Referencia:
[url]
http://www.coderanch.com/t/268070/Programmer-Certification-SCJP/certification/Strings
[/url]
Melhorando ainda mais o POST. Agora colocando o GC. Voces sabem quais objetos estaram aptos para serem excluidos pelo GB?
Na minha opinião esta:
Os objetos "Fred47" e "ed4" estao aptos a serem excluidos pelo GC quando a execucao estiver em return...
O que acham?
|
omaisnormalbaba!!!!!!!!!!!! |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 19/03/2009 21:31:19
|
jbjares
JavaChild
![[Avatar]](/images/avatar/17d079a0102e73dbd8c7cd98b6716b5b.png)
Membro desde: 19/10/2006 18:51:13
Mensagens: 103
Offline
|
é isso aí.. concordo... Nota 10 omaisnormalbaba.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 20/03/2009 10:05:14
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20584
Localização: Curitiba/PR
Offline
|
Não entendo pq se dá tanta relevância a esse tema, se nunca vi uma aplicação em que o conhecimento disso a melhorasse, ou evitasse que você caísse numa armadilha. É só pra agradar os certificadores, mesmo. Claro, a única coisa relevante disso, é saber que as vezes uma comparação com == pode dar true para strings iguais, mas que isso nem sempre será verdade e que, portanto, o equals deverá ser usado, como você já faria para qualquer objeto. Mas observado esse detalhe, não sei porque perde-se tanto tempo estudando cada meandro do Pool de strings. Contar quantos objetos foram criados? Francamente, parece gasto de tempo e esforço demais, para uma curiosidade interessante da linguagem... É por essas e outras que realmente questiono a qualidade dessas provas de certificação. Temos um candidato que sabe exatamente como funciona cada vírgula do compilador, mas codifica de maneira mal, porca e inenteligível, como os códigos que ele vê nas provas e nos livros da Kathy.
This message was edited 3 times. Last update was at 20/03/2009 10:08:53
|
@ViniGodoy - Lattes
Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!
Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).
Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 20/03/2009 10:18:56
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
ViniGodoy wrote:
Contar quantos objetos foram criados? Francamente, parece gasto de tempo e esforço demais, para uma curiosidade interessante da linguagem...
É por essas e outras que realmente questiono a qualidade dessas provas de certificação. Temos um candidato que sabe exatamente como funciona cada vírgula do compilador, mas codifica de maneira mal, porca e inenteligível, como os códigos que ele vê nas provas e nos livros da Kathy.
+1
|
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 20/03/2009 11:59:50
|
brrodo
JavaTeenager
Membro desde: 07/02/2009 23:31:16
Mensagens: 173
Offline
|
ViniGodoy wrote:Não entendo pq se dá tanta relevância a esse tema, se nunca vi uma aplicação em que o conhecimento disso a melhorasse, ou evitasse que você caísse numa armadilha. É só pra agradar os certificadores, mesmo.
Claro, a única coisa relevante disso, é saber que as vezes uma comparação com == pode dar true para strings iguais, mas que isso nem sempre será verdade e que, portanto, o equals deverá ser usado, como você já faria para qualquer objeto.
Mas observado esse detalhe, não sei porque perde-se tanto tempo estudando cada meandro do Pool de strings.
Contar quantos objetos foram criados? Francamente, parece gasto de tempo e esforço demais, para uma curiosidade interessante da linguagem...
É por essas e outras que realmente questiono a qualidade dessas provas de certificação. Temos um candidato que sabe exatamente como funciona cada vírgula do compilador, mas codifica de maneira mal, porca e inenteligível, como os códigos que ele vê nas provas e nos livros da Kathy.
Eu tbm concordo...Mas é mto radical analisar dessa forma.
Trabalho com Java já faz tempo e dá pra dizer q 70% das coisas q vc aprende estudando pra certificação não te faz tornar um melhor desenvolvedor ou analista, mas sim te torna um bom conhecedor da linguagem Java.
Ter certificação sem experiência realmente não vale nada. O que adianta conhecer "cada vírgula da linguagem" se vc não sabe nada de MVC, design patterns e etc!?
Agora se vc agrega certificações a um currículo experiente, é ponto a mais pra vc. Poder dizer q é "reconhecido" pela Sun, pesa. O tal "conhecimento formal" q a grande maioria das empresas valoriza.
This message was edited 1 time. Last update was at 20/03/2009 12:01:18
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 20/03/2009 12:03:26
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
Eu fiz uma prova de SCJP 5 e posso dizer que tais questões de pool de strings não caem (ou se caem é só umazinha).
De qualquer maneira, acho incrível a quantidade de tempo que se gasta tentando estudar essas coisas, quando outras coisas caem mais e são mais importantes.
Por exemplo, a parte de serialização cai bastante e, na prática, é muito importante para diagnosticar alguns problemas que ocorrem em application servers.
|
|
|
 |
|
|