Dúvida a respeito de Set

4 respostas
A

Olá pessoal, alguém pode me explicar qual o motivo do objeto referenciado por i2 não ser removido do set?

import java.util.*;

public class Ex75 {
	public static void main(String[] args) {
		Set<Integer> set = new HashSet<Integer>();
		Integer i1 = 45;
		Integer i2 = 46;
		set.add(i1);
		set.add(i1);
		set.add(i2);
		System.out.printf("%d ",set.size());
		set.remove(i1);
		System.out.printf("%d ",set.size());
		i2 = 47;
		set.remove(i2);
		System.out.printf("%d",set.size());		
	}
}

A resposta é 2 1 1

Obrigado!

4 Respostas

Kaesar

Na linha 10 você passou para o método add uma cópia do valor contido em i2 = 46.

o valor contido na variável e no set são independentes, ao passar i2 contendo o valor 47 você disse: “remova o número 47 do set” o que não aconteceu ja que após a linha 12 o único valor contido no Set é a copia de 46.

E

Eu percebi que você tem aquele famoso problema (que já vi com gente que programa em Java faz muito tempo, você não está sozinho nessa) que é a de achar que “objetos têm nome”.

Quem tem nome são as variáveis, não os objetos. Apenas para facilitar a explicação, costumamos dar nomes aos objetos, mas isso não pode ser generalizado.

Ao analisar o seu programa, provavelmente você deve ter pegado o conjunto “set” (ok, mais rigorosamente: o objeto apontado pela variável “set”) e ter pensado que você incluiu 2 objetos com nomes “i1” e “i2”; ao pensar assim, você cometeu o erro de achar que, quando se altera a variável com nome i2, ter pensado que o conjunto “set” tivesse sido alterado (afinal de contas, você não mexeu em i2 e não incluiu uma referência a i2 no set, não é mesmo?)

E é por isso que quando você atribuiu um novo objeto a i2 você achou que a alteração se refletiria no conjunto “set”.

drsmachado

entanglement:
Eu percebi que você tem aquele famoso problema (que já vi com gente que programa em Java faz muito tempo, você não está sozinho nessa) que é a de achar que “objetos têm nome”.

Quem tem nome são as variáveis, não os objetos. Apenas para facilitar a explicação, costumamos dar nomes aos objetos, mas isso não pode ser generalizado.

Ao analisar o seu programa, provavelmente você deve ter pegado o conjunto “set” (ok, mais rigorosamente: o objeto apontado pela variável “set”) e ter pensado que você incluiu 2 objetos com nomes “i1” e “i2”; ao pensar assim, você cometeu o erro de achar que, quando se altera a variável com nome i2, ter pensado que o conjunto “set” tivesse sido alterado (afinal de contas, você não mexeu em i2 e não incluiu uma referência a i2 no set, não é mesmo?)

E é por isso que quando você atribuiu um novo objeto a i2 você achou que a alteração se refletiria no conjunto “set”.


Em outras palavras, coloque num cesto 1 banana e a chame de f1, 1 maçã chamada f2 e 1 laranja chamada f3. Colocou? Quantas frutas há no cesto? Agora retire o tomate. Agora você vai dizer que f2 é uma alface. Retire f2 do cesto. Quantas frutas há no cesto?
Entendeu?

A

drsmachado, entanglement, Kaesar

Obrigado pelas explicações, CLARO! Eu que viajei nessa, ao atribuir 47 a i2 estou querendo dizer “crie um objeto do tipo Integer com valor 47 e que seja referenciado pela variável i2”. Ou seja, o objeto com valor 46 que está no set perdeu a referência através da variável i2

Criado 13 de fevereiro de 2013
Ultima resposta 18 de fev. de 2013
Respostas 4
Participantes 4