Problemas com o HashSet que não substitui objetos iguais !?

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

Dê uma analizada no código de HashSet e de HashMap e veja que ele não verifica os objetos por um id e sim pelo hash calculado, que bem provável serão diferentes já que são objetos diferentes.

Até!

Mas o Hash Calculado não é feito através do método hashCode() que eu sobrescrevi, e estou voltando o id?

E mesmo assim se ele identificasse como diferente ele não deveria ter adicionado o u3 ao Set, mas ele não fez isso, ele simplesmente não incluiu nem substituiu o elemento no Set

Mas ele não vai substituir mesmo não. Só não vai adicionar se o objeto já estiver no conjunto:

[code]public boolean add(Object o)Adds the specified element to this set if it is not already present.

Returns:
true if the set did not already contain the specified element.[/code]

T+