Estou tendo problemas muito estranhos com o HashSet. Criei um POJO simples com um Integer id e uma String nome, sobrescrevi o equals e o hashCode onde somente a propriedade ID me importa:
@Override
public int hashCode() {
return id;
}
@Override
public boolean equals(Object obj) {
if (this == obj)return true;
if (obj == null)return false;
if (getClass() != obj.getClass())return false;
final Usuario other = (Usuario) obj;
if (id != other.id)return false;
return true;
}
vejam o teste abaixo:
private void teste() {
Set<Usuario> usuarios = new HashSet<Usuario>();
Usuario u1 = new Usuario(1, "Joao");
Usuario u2 = new Usuario(2, "Jose");
usuarios.add(u1);
usuarios.add(u2);
Usuario u3 = new Usuario(2, "Antonio");//Mesmo ID do u2
System.out.println("contains = " + usuarios.contains(u3));
System.out.println("u2 equals u3 = " + u2.equals(u3));
usuarios.add(u3);
for(Usuario u : usuarios){
System.out.println(u.getNome());
}
}
a Saida é
contains = true
u2 equals u3 = true
Joao
Jose
MAS o u2 (Jose) não deveria ter sido substituido pelo u3 (Antonio) já que os dois são iguais???