Dúvida Questao (HashCode e Equals)

9 respostas
evertonsilvagomesjav

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.

9 Respostas

V

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…

evertonsilvagomesjav

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?

V

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

evertonsilvagomesjav

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?

V

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???..

evertonsilvagomesjav

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

Set<KeyMaster> set = new HashSet<KeyMaster>();
		
		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());
V

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…

evertonsilvagomesjav

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é.

V

isso msm…

Criado 8 de fevereiro de 2010
Ultima resposta 8 de fev. de 2010
Respostas 9
Participantes 2