Dúvida com lógica em ArrayList

4 respostas Resolvido
java
R

Tenho este código:

List<ClienteMOD> clientes = new ArrayList<ClienteMOD>();
clientes.add(new ClienteMOD(1, "Pessoa 1"));
clientes.add(new ClienteMOD(2, "Pessoa 2"));
clientes.add(new ClienteMOD(3, "Pessoa 3"));
clientes.add(new ClienteMOD(4, "Pessoa 4"));
clientes.add(new ClienteMOD(5, "Pessoa 5"));
        
ClienteMOD c = clientes.get(2);
c.setNome("Alterado");
c = null;
        
for(ClienteMOD cl : clientes){
     System.out.println("ID: " + cl.getId());
     System.out.println("Nome: " + cl.getNome());
}

A saída é esta:
ID: 1
Nome: Pessoa 1
ID: 2
Nome: Pessoa 2
ID: 3
Nome: Alterado
ID: 4
Nome: Pessoa 4
ID: 5
Nome: Pessoa 5

Eu pego o cliente da posição 2 no ArrayList, e seto para a variável c. Neste momento não é criado um novo cliente, apenas é copiado o endereço de memória.
Ai altero o nome dele, e como foi copiado o endereço de memória é alterado no ArrayList automaticamente, e logo em seguida seto como null a variável c. Quando seto como null o endereço de memória se perde.

Mas quando faço o foreach ele consegue ler normalmente a posição 2 no ArrayList, eu setei como null, não era para ter perdido o endereço de memória?

4 Respostas

rodrigo.uchoa

Não, o raciocínio certo ai nesse é que em um dado momento existem duas referencias para o objeto Cliente. Uma dentro do ArrayList, e outra na variavel c. O fato de você ter feito a variável c “apontar” para null, não muda em nada o “apontamento” do objeto ArrayList para o objeto Cliente.

R

Entendi, mas porque eu atribuir null não muda em nada no ArrayList, mas quando eu altero o nome do cliente na variável c altera no ArrayList.

Sandro_Machado
Solucao aceita

se não me engano quando você fez ClienteMOD c = clientes.get(2); você tem 2 objetos
apontando pro mesmo endereço de memória, então setando qualquer um vai alterar o valor para os dois,
mas quando você atribui null a ele voce apenas anula o apontamento do c para o endereço de memoria, não oque está no arrayList

R

Entendi, vlw

Criado 3 de março de 2016
Ultima resposta 3 de mar. de 2016
Respostas 4
Participantes 3