Dúvida Questao (HashCode e Equals)

import java.util.*; 2. class KeyMaster { 3. public int i; 4. public KeyMaster(int i) { this.i = i; } 5. public boolean equals(Object o) { return i == ((KeyMaster)o).i; } 6. public int hashCode() { return i; } 7. } 8. public class MapIt { 9. public static void main(String[] args) { 10. Set<KeyMaster> set = new HashSet<KeyMaster>(); 11. KeyMaster k1 = new KeyMaster(1); 12. KeyMaster k2 = new KeyMaster(2); 13. set.add(k1); set.add(k1); 14. set.add(k2); set.add(k2); 15. System.out.print(set.size() + ":"); 16. k2.i = 1; 17. System.out.print(set.size() + ":"); 18. set.remove(k1); 19. System.out.print(set.size() + ":"); 20. set.remove(k2); 21. System.out.print(set.size()); 22. } 23. }

Resposta: 2:2:1:1

Pq quando ele altera o valor de “i” em k2 ele nao remove k2 da lista? Eu errei pq achei que era 2:2:1:0 debugando aqui realmente a resposta é 2:2:1:1.

boa pergunta essa…
posso estar errado mas eu acho que quando vc adiciona um elemento no conjunto ele faz uma cópia desse elemento por isso a mundança que vc faz em k2 não reflete no conjunto…
mas não sei se estou certo…
a outra possibilidade(talvez a que seja a melhor)…
eh que quando vc altera um elemento que adicionou no conjunto como foi feito no código nada será verificado se existe um outro elemento igual ao que vc modificou…
o conjunto só testa se ha elementos semelhantes no método add…

Puts deixa ver se entende, depois de adicionado um elemento na lista se for alterado o seu estado não tera uma verificaçao com isso nao tera como remover ele da lista?

tem como remover somente se vc passar um objeto com as msm informações do objeto que vc modificou na lista…

Mas ai teria que ser o mesmo objeto, e consequentemente pra isso acontecer so teria como se eu nao alterasse seu estado num eh n?

não…
olha só esse exemplo:


import java.util.*;   
class KeyMaster {   
  public int i;   
  public KeyMaster(int i) { this.i = i; }   
  public boolean equals(Object o) { return i == ((KeyMaster)o).i; }   
  public int hashCode() { return i; }   
}   

public class MapIt {   
  public static void main(String[] args) {   
    Set<KeyMaster> set = new HashSet<KeyMaster>();   
    KeyMaster k1 = new KeyMaster(1);   
    KeyMaster k2 = new KeyMaster(2);   
    set.add(k1); 
    set.add(k2);   
    //altero k2 pra 3
    k2.i = 3;
    KeyMaster k3 = new KeyMaster(3);
    //vai remover o objeto k2 que eu inseri no conjunto(lembra alterei ele pra 3) 
    set.remove(k3)
  }   
}  

entendeu???..

Tem certeza que funciona? Fiz o teste aqui funcionou nao…

[code]Set set = new HashSet();

	KeyMaster k1 = new KeyMaster(1);
	
	KeyMaster k2 = new KeyMaster(2);
	
	
		
	set.add(k1); 
	set.add(k1);
	set.add(k2); 
	set.add(k2);
	
	System.out.print(set.size() + ":");
		
	k2.i = 4;
	
	KeyMaster k3 = new KeyMaster(4);				
	
	System.out.print(set.size() + ":");
	
	set.remove(k1);
	
	System.out.print(set.size() + ":");
	
	set.remove(k3);
			
	System.out.print(set.size());[/code]

ops perdão…
realmente não funciona por causa dos contratos(hashcode e equals)…
eh realmente pra não tem como vc remover o objeto depois que vc altera o seu estado…
eh uma boa questão, mas só lembrando que esse código mostra uma má prática de programação…

legal mesmo essa questão, nesse caso ele remove o objeto pelo seu estado inicial em que foi add de acordo com o contrato de hashing e equals, né.

isso msm…