| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 11/03/2010 07:05:56
|
hlegius
JavaChild
![[Avatar]](/images/avatar/0f20c77d6afb02422603acb0329b5a41.jpeg)
Membro desde: 07/05/2006 14:29:25
Mensagens: 126
Localização: Guarulhos, SP
Offline
|
Salve pessoal !
Estava lendo o livro Hardcore Java quando o autor afirma que as coleções em Java são por referência, logo não criam cópias dos objetos nela inseridos.
Resolvi fazer um teste com ArrayList, porém, eu adicionei um objeto à coleção, listei o conteúdo da collection, setei nulo o objeto que havia passado ao ArrayList e por fim pedi a listagem dos itens do vetor e: exibiu o conteúdo normal.
Obviamente fiz alguma coisa errada - ou estou interpretando de forma errada ( ? ) o que o autor do livro disse.
Alguém tem algum tipo de informação sobre ?
Abraços !
This message was edited 1 time. Last update was at 11/03/2010 13:41:33
|
http://programe.me
Zend Certified Engineer
ArchLinux - A simple lightweight Linux Distribution |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 11/03/2010 08:25:10
|
dyorgio
JavaEvangelist
![[Avatar]](/images/avatar/8a36dfc67ebfbbea9bd01cd8a4c8ad32.png)
Membro desde: 05/05/2005 20:03:20
Mensagens: 323
Localização: Porto Alegre - RS
Offline
|
Nada de errado cara...
se vc setou :
vc simplismente setou a referencia na variavel seuObjeto apontando para null.
java não tem ponteiro, logo, la dentro do arraylist existe uma outra "variavel" que aponta para
a mesma referencia do seuObjeto;
se vc setar qualquer uma das duas (arraylist e seuObjeto) para null isso não
modifica em nada a referencia da outra.
Para ter esse comportamento tens que trabalhar com um nivel a mais, por exemplo
espero que tenha entendido
|
I can fly!!! |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 11/03/2010 08:30:06
|
davidbuzatto
Moderador
![[Avatar]](/images/avatar/7ba6d33c373fea56b7258003b16c68e5.jpg)
Membro desde: 07/08/2004 23:47:57
Mensagens: 4013
Localização: Vargem Grande do Sul - SP
Offline
|
Em Java TUDO é passado por favor. Não quer dizer que se você modificou uma determinada referência essa modificação será replicada para quem aponta para o mesmo local. Em C++ vc conseguiria amarrar o endereço na coleção e então mudar o ponteiro, mas em Java não.
[]´s
|
Seja educado. Agradeça quem te ajudou. Não custa nada.
Dúvidas de Java? Utilize o fórum! Não respondo via MP.
"Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Fowler)
"A vida é um escândalo, e no final dá sempre errado. O que humaniza o homem é o fracasso."
http://davidbuzatto.com.br | GitHub | uHunt | CV Lattes | Last.fm |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 11/03/2010 09:03:33
|
hlegius
JavaChild
![[Avatar]](/images/avatar/0f20c77d6afb02422603acb0329b5a41.jpeg)
Membro desde: 07/05/2006 14:29:25
Mensagens: 126
Localização: Guarulhos, SP
Offline
|
Aaah, então eu entendi errado o que o autor do livro tentou explicar. Vou ver se consigo pegar o trecho hoje quando chegar em casa para reler e ver se entendo o que ele quis dizer com referência e não por valor.
Não tem como em Java forçar uma referência ? É sempre por valor e "ponto" ?
Abraços !
|
http://programe.me
Zend Certified Engineer
ArchLinux - A simple lightweight Linux Distribution |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 11/03/2010 09:05:08
|
dyorgio
JavaEvangelist
![[Avatar]](/images/avatar/8a36dfc67ebfbbea9bd01cd8a4c8ad32.png)
Membro desde: 05/05/2005 20:03:20
Mensagens: 323
Localização: Porto Alegre - RS
Offline
|
O contrario, é sempre por referencia, porem é o valor de uma referencia...
|
I can fly!!! |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 11/03/2010 09:11:52
|
maior_abandonado
JWizard
![[Avatar]](/images/avatar/0d7c463832b871c20405a6c9296b5517.jpg)
Membro desde: 03/09/2007 11:30:08
Mensagens: 2694
Localização: sp
Offline
|
hlegius wrote:Aaah, então eu entendi errado o que o autor do livro tentou explicar. Vou ver se consigo pegar o trecho hoje quando chegar em casa para reler e ver se entendo o que ele quis dizer com referência e não por valor.
Não tem como em Java forçar uma referência ? É sempre por valor e "ponto" ?
Abraços !
eu posso até estar enganado mas... acho que você intendeu corretamente o livro, mas intendeu errado o exemplo no código.
pense no seguinte, quando você da um
new SeuObjeto()
, você cria o objeto na memória, um objeto de verdade, não uma referencia, sempre que você coloca
variavel = objeto;
variavel2 = mesmoObjeto
suaLista.add(objeto)
cada um ai guarda uma referencia para o objeto da memoria, portanto, quando você faz
variavel2 = null
você nulou a referencia variavel2 (sim, ela é uma referencia, e não o objeto), mas ainda existem as outras 2 referencias, se você fizer o mesmo com variavel, ainda vai ter a referencia adicionada na lista, mesmo que você remova da lista ainda vai existir o objeto la na memória até que o garbage colector o remova, apenas as referencias foram perdidas...
pense o seguinte, quando você tem uma variavel de um objeto, essa variavel é a referencia, não o objeto em si, ou seja:
se você da um x = new Objeto();, x aponta para esse objeto ai, se você fizer isso denovo, x vai apontar para um segundo objeto criado em memoria com o new, mas você não mecher no primeiro objeto criado... ai se você depois fizer x = null; você fez x não referenciar mais ninguém, mas os 2 objetos ainda vão estar la na memória, sem você ter mechido...
This message was edited 1 time. Last update was at 11/03/2010 09:15:05
|
espero ter ajudado...
falando nisso, caso seu problema tenha sido resolvido, edite o seu primeiro post e coloque um [RESOLVIDO] no titulo do tópico.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 11/03/2010 09:14:30
|
dyorgio
JavaEvangelist
![[Avatar]](/images/avatar/8a36dfc67ebfbbea9bd01cd8a4c8ad32.png)
Membro desde: 05/05/2005 20:03:20
Mensagens: 323
Localização: Porto Alegre - RS
Offline
|
Apenas para clarificar...
O cara deve estar perguntando : "Ta, mais como eu tiro esse objeto da memoria?"
simples, vc não tira...
O Garbage Collector faz isso pra vc, assim que ele verificar que ninguem mais esta apontando
para esse objeto ele limpa ele da memoria.
|
I can fly!!! |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 11/03/2010 09:18:35
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20578
Localização: Curitiba/PR
Offline
|
Ele só quer que você tome o seguinte cuidado: Como você pode ver, o nome do objeto original também mudou. Isso pq, na verdade, tanto a lista quanto a variável autor apontam para o mesmo objeto na memória.
This message was edited 1 time. Last update was at 11/03/2010 09:18:47
|
@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) 11/03/2010 13:41:18
|
hlegius
JavaChild
![[Avatar]](/images/avatar/0f20c77d6afb02422603acb0329b5a41.jpeg)
Membro desde: 07/05/2006 14:29:25
Mensagens: 126
Localização: Guarulhos, SP
Offline
|
maior_abandonado,
Entendi ! Quase fiquei com a ideia errada em mente hahaha =P Já estava dando um nó x)
dyorgio, certo. O GC passa assim que não houver mais referências àquele objeto. Mas seria algo imediato ou ele "roda" de tempos em tempos ?
ViniGodoy, sim, provavelmente ele queria alertar para isso mesmo. Alterando ou removendo alguma coisa da coleção, afetará também o objeto "real", assim digamos.
Valeu mesmo galera pelas explições detalhadas
|
http://programe.me
Zend Certified Engineer
ArchLinux - A simple lightweight Linux Distribution |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 11/03/2010 13:46:17
|
dyorgio
JavaEvangelist
![[Avatar]](/images/avatar/8a36dfc67ebfbbea9bd01cd8a4c8ad32.png)
Membro desde: 05/05/2005 20:03:20
Mensagens: 323
Localização: Porto Alegre - RS
Offline
|
Exitesm 128391872391823 de implementações do GC na JVM...
e ainda cada uma com configurações diversas..
o GC normalmente tem prioridade a baixo da app, e se ele ve que deixando o lixo ali
por digamos 10 minutos não afetara o desempenho da app, tem memoria sobrando por exemplo,
ele não fara a limpeza...pois um GC que faz limpeza direto afeta a performance da app..
porem existem cenarios que tem muita sujeira a ser limpa o tempo todo.
ai vc configura o GC para isso, ou podes usar System.gc();
esse comando não é recomendado, melhor configurar o GC do que pedir pra ele rodar...
e tb na documentação do System.gc() diz que não é garantido que essa chamada faça algo,
as vezes tu chama o GC mais ele soh limpa quando achar que deve .
resumindo..em 98,7241% dos casos vc não precisa mecher no GC, essa é a blz da JVM
|
I can fly!!! |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 11/03/2010 15:15:04
|
hlegius
JavaChild
![[Avatar]](/images/avatar/0f20c77d6afb02422603acb0329b5a41.jpeg)
Membro desde: 07/05/2006 14:29:25
Mensagens: 126
Localização: Guarulhos, SP
Offline
|
dyorgio wrote:(..)e tb na documentação do System.gc() diz que não é garantido que essa chamada faça algo,
as vezes tu chama o GC mais ele soh limpa quando achar que deve  . (..)
Hahahaha ! Rachei o bico com isso, cara =P
A parada tem vida própria !
Mas certo, entendi !
Agradeço a sua explicação, agora as coisas fazem mais sentido para mim !
Abraços !
|
http://programe.me
Zend Certified Engineer
ArchLinux - A simple lightweight Linux Distribution |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 11/03/2010 15:40:40
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
Membro desde: 11/12/2006 08:22:01
Mensagens: 20578
Localização: Curitiba/PR
Offline
|
Fazendo profiling da VM você vai ver que o GC tem duas formas de operação: a) A limpeza de objetos de vida curta: Que é extremamente rápida e frequente. Muitas vezes a limpeza desses objetos nem sequer envolve desreservar memória, e sim, só usar esse espaço livre para outros objetos. b) A limpeza de objetos de vida longa: Aqui geralmente o GC faz uma compactação da memória e faz limpeza de fato de memória. Você também observa que o gc() roda com mais frequência se a memória máxima está próxima de ser atingida. E a limpeza longa quase nunca ocorre quando isso está longe. O uso de gc tem diversas vantagens sobre linguagens não gerenciadas: Permite que blocos maiores de memória sejam alocados ou desalocados, o que tem impacto direto na performance. Permite o reaproveitamento fácil de áreas de memória, o que torna o custo da criação e destruição dos objetos de vida curta próximo ao zero. Mas tem desvantagens também: Você nunca sabe exatamente quando o gc vai rodar e quanta memória ele vai liberar. Como ele também trabalhar com uma área de memória própria, ele pode consumir mais espaço do que o mínimo necessário para sua aplicação rodar. Para mais informações sobre o funcionamento do gc e alocação de memória leia: http://www.ibm.com/developerworks/library/j-jtp01274.html http://www.ibm.com/developerworks/java/library/j-jtp09275.html http://www.cs.ubc.ca/local/reading/proceedings/spe91-95/spe/vol23/issue7/spe836.pdf http://www.cs.ubc.ca/local/reading/proceedings/spe91-95/spe/vol24/issue6/spe895.pdf Para saber como funcionará a próxima versão de gc, que entrará no Java 7, leia: http://research.sun.com/jtech/pubs/04-g1-paper-ismm.pdf
This message was edited 1 time. Last update was at 11/03/2010 15:42:37
|
@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 |
|
|
 |
|
|