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?