método contains de HashSet

Conforme o exemplo abaixo, tirado de uma página de discussão do hibernate, após ser alterado o valor de um atributo, o hashcode do objeto será mudado. Até ai, tudo bem.
O que eu nao entendi foi o seguinte: o objeto t foi adicionado ao conjunto. Após ser feito o save, o hash é alterado. Mas ele é o mesmo objeto de memória que está no conjunto…
Por acaso, quando adicionado, ele armazena em algum local o valor hash que o elemento tinha no momento da inclusão?

Thinger t = new Thinger(); // t has no ID yet Set s = new HashSet(); s.add(t); s.contains(t); // returns true session.save(t); // t now has an ID s.contains(t); // returns false, because t's hash code changed

Nao, nao armazena. Como o hashCode() eh calculado a cada invocacao, a segunda chamada vai falhar justamente pelo save() ter modificado a referencia de “t”, adicionando o id.

Rafael

o q deve acontecer, foi o q o rafael falou.
Antes de dar o session.save, o objeto t, não estava com algum atributo preenchido para calcular o valor do hash. seria o id por exemplo, sendo ele auto incremento, e somente preenchido qdo for persistir no banco.

apos o save, o atributo( que influencia para o calculo do hash ) foi preenchido,
e o como o metodo contains utiliza o equals e o hashCode ( contrato ) para fazer essa comparacao , ira retornar false.

vamos supor q os métodos equals e hashCode de Thinger sao:


public boolean equals(Object o){
  if  ( (o instanceof Thinger) && ((Thinger)o).id != 0) && (this.id == ((Thinger)o).id) ) {
      return true;
   }
   return false;
}

public int hashCode(){
  return id*funcaoHash(); //funcaoHash pode ser qq funcao q torne eficaz o hash.
}

ou seja, se a referencia muda , o id tb muda, e os objetos tornam diferentes, logo o contains retorna false.