Por que alterar o código de hash de um objeto usado como chave em um HashMap faz com que um retorno de pesquisa seja nulo?

Considere o seguinte cenário:

Object o1 = new Object();
Object o2 = new Object();

HashMap<Object, Object> map = new HashMap<Object, Object>();
map.put(o1, o2);

boolean test1 = map.get(o1) == o2; // This evaluates to true

// Now lets say we alter the state of o1:
o1.setSomeInternalState(Object newState);

boolean test2 = map.get(o1) == o2; // This evaluates to false, because now map.get(o1) returns null

Suponha que a classe para o1 tenha substituídoequals() ehashCode().

Encontrei esse problema durante a depuração porque havia substituído explicitamenteequals ehashCode em um objeto específico que estou usando em alguma lógica de negócios. Compreendo perfeitamente por que o código de hash do objeto muda quando altero seu estado, mas por que o map.get (o1) retorna nulo por causa disso? Existe apenas um objeto; portanto, o código de hash da chave não deve corresponder?

questionAnswers(6)

yourAnswerToTheQuestion