[Resolvido]Duvida com List

7 respostas
rafaelrodrigues1607

Galera,

Estou encabulado com isso! Vejam o código abaixo:

ChuvasEntity chuvasEntity = new ChuvasEntity();
List<ChuvasEntity> listaChuvasEntity = new ArrayList<ChuvasEntity>();


			chuvasEntity.setDia(1);
			listaChuvasEntity.add(chuvasEntity);
				
			chuvasEntity.setDia(2);
			listaChuvasEntity.add(chuvasEntity);

Quando estou "debugando" ele add o valor 1 normalmente, mas quando adiciono o valor 2, ele também sobrescreve o valor 1. Então eu fico com as duas posições do meu List com o valor 2. Estou fazendo da forma certa? Porque está sobrescrevendo?

7 Respostas

darklordkamui

O que acontece aqui é o seguinte… como vc ta usando o mesmo objeto para adicionar na lista, toda vez que vc modificar ele vai na referencia e muda o valor…

vc poderia fazer assim…

List listaChuvasEntity = new ArrayList();

listaChuvasEntity.add(new ChuvasEntity(1));
			
		listaChuvasEntity.add(new chuvasEntity(2));

lembrando que teria que criar um construtor para a Classe ChuvasEntity

matheuslmota

darklordkamui:
O que acontece aqui é o seguinte… como vc ta usando o mesmo objeto para adicionar na lista, toda vez que vc modificar ele vai na referencia e muda o valor…

vc poderia fazer assim…

List listaChuvasEntity = new ArrayList();

listaChuvasEntity.add(new ChuvasEntity(1));
			
		listaChuvasEntity.add(new chuvasEntity(2));

lembrando que teria que criar um construtor para a Classe ChuvasEntity

Rapaz, recentemente tive extamente o mesmo problema com um código em C# e resolvi desse mesmo modo que você. Mas o que não entendi é que teoricamente estave sendo feito uma passagem por cópia e mesmo assim dava o problema. Bizarro.

rafaelrodrigues1607

matheuslmota:
darklordkamui:
O que acontece aqui é o seguinte… como vc ta usando o mesmo objeto para adicionar na lista, toda vez que vc modificar ele vai na referencia e muda o valor…

vc poderia fazer assim…

List listaChuvasEntity = new ArrayList();

listaChuvasEntity.add(new ChuvasEntity(1));
			
		listaChuvasEntity.add(new chuvasEntity(2));

lembrando que teria que criar um construtor para a Classe ChuvasEntity

Rapaz, recentemente tive extamente o mesmo problema com um código em C# e resolvi desse mesmo modo que você. Mas o que não entendi é que teoricamente estave sendo feito uma passagem por cópia e mesmo assim dava o problema. Bizarro.

Achei estranho mesmo, porque ele cria uma nova posição no meu List. Se ele não criasse essa nova posição até entenderia… Mas resolvido. VOu fazer assim também. Obrigado pessoal!

darklordkamui

o que acontece no codigo que vc fez é o seguinte…

eu tenho um objeto alocado na posição x da memoria…

pego ele e adiciono um novo atributo no caso a data no valor 1…
e adiciono na lista…

ai vc foi la e pegou o mesmo objeto e mudou o atributo dele para 2…
e adicionou ele na lista…

resumindo o modo que vc criou somente ira pega a mesma instancia de objeto e o modificar, ao invez de criar uma nova…

matheuslmota

darklordkamui:
o que acontece no codigo que vc fez é o seguinte…

eu tenho um objeto alocado na posição x da memoria…

pego ele e adiciono um novo atributo no caso a data no valor 1…
e adiciono na lista…

ai vc foi la e pegou o mesmo objeto e mudou o atributo dele para 2…
e adicionou ele na lista…

resumindo o modo que vc criou somente ira pega a mesma instancia de objeto e o modificar, ao invez de criar uma nova…

Pois é, mas até onde eu saiba ele fez uma passagem por cópia, o que teoricamente garantiria duas instãncias diferentes passadas para a lista. Até onde eu saiba só existe passagem por cópia em Java.

darklordkamui

matheuslmota:
darklordkamui:
o que acontece no codigo que vc fez é o seguinte…

eu tenho um objeto alocado na posição x da memoria…

pego ele e adiciono um novo atributo no caso a data no valor 1…
e adiciono na lista…

ai vc foi la e pegou o mesmo objeto e mudou o atributo dele para 2…
e adicionou ele na lista…

resumindo o modo que vc criou somente ira pega a mesma instancia de objeto e o modificar, ao invez de criar uma nova…

Pois é, mas até onde eu saiba ele fez uma passagem por cópia, o que teoricamente garantiria duas instãncias diferentes passadas para a lista. Até onde eu saiba só existe passagem por cópia em Java.

Não… ele não garante criar outra instancia… parece logico que ele ao adicionar um vai la e crie um novo… mais ele não faz isso… ele vai olhar la e dizer ha esse cara com a posição x existe já vou sobre escrever pelo novo

para vc ver isso acontecer… manda ele imprimir em um sysout veras que o valor de memoria é o mesmo em ambos

matheuslmota

darklordkamui:

Pois é, mas até onde eu saiba ele fez uma passagem por cópia, o que teoricamente garantiria duas instãncias diferentes passadas para a lista. Até onde eu saiba só existe passagem por cópia em Java.

Não… ele não garante criar outra instancia… parece logico que ele ao adicionar um vai la e crie um novo… mais ele não faz isso… ele vai olhar la e dizer ha esse cara com a posição x existe já vou sobre escrever pelo novo

para vc ver isso acontecer… manda ele imprimir em um sysout veras que o valor de memoria é o mesmo em ambos[/quote]

Pois é, interessante isso. A lógica é que seja uma passagem por cópia. Vai ver que pra economizar memória o Java opta por passar uma referência.

Criado 30 de abril de 2012
Ultima resposta 30 de abr. de 2012
Respostas 7
Participantes 3