[Resolvido] Collections por referência. É real ?  XML
Índice dos Fóruns » Java Básico
Autor Mensagem
hlegius
JavaChild
[Avatar]

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
[WWW] [MSN] [ICQ]
dyorgio
JavaEvangelist
[Avatar]

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!!!
[Email] [MSN]
davidbuzatto
Moderador
[Avatar]

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
[WWW]
hlegius
JavaChild
[Avatar]

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
[WWW] [MSN] [ICQ]
dyorgio
JavaEvangelist
[Avatar]

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!!!
[Email] [MSN]
maior_abandonado
JWizard
[Avatar]

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.
dyorgio
JavaEvangelist
[Avatar]

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!!!
[Email] [MSN]
ViniGodoy
Moderador
[Avatar]

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
[WWW]
hlegius
JavaChild
[Avatar]

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
[WWW] [MSN] [ICQ]
dyorgio
JavaEvangelist
[Avatar]

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!!!
[Email] [MSN]
hlegius
JavaChild
[Avatar]

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
[WWW] [MSN] [ICQ]
ViniGodoy
Moderador
[Avatar]

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
[WWW]
 
Índice dos Fóruns » Java Básico
Ir para:   
Powered by JForum 2.1.8 © JForum Team