A implementação do método hashCode exige algumas regras:
-
se uma classe sobrescreve o equals, ela deve sobrescrever o hashCode também;
-
se ambos são sobrescritos, equals e hashCode devem usar o mesmo conjunto de campos;
-
se o equals entre dois objetos é true, o hashCode desses objetos deve ser o mesmo;
-
se o objeto for imutável, então o hashCode pode ser inicializado através de lazy initialization e ser guardado em cache;
Isso vai depender de como a estrutura de dados foi implementada.
As classes HashMap e Hashtable do Java por exemplo possuem um atributo que é um array de um tipo de dado que possui dois atributos, a chave e o valor daquela chave.
Ele é usado no algoritmo que determina o índice, se você olhar o código fonte da classe HashMap e da classe Hashtable, verá que elas usam algoritmos diferentes, mas em ambas o hashCode é utilizado no cálculo.
Não, pelo menos não no caso do HasMap e Hashtable.
Sim, é como originalmente a estrutura foi proposta.
A classe HashMap possui um atributo Node<K,V>[] table
A classe Hashtable possui um atributo Entry<?,?>[] table
Na verdade é o hashCode que tem a ver com Tabelas Hash. Esse método foi declarado na classe Object justamente para facilitar a implementação de Tabelas Hash. A própria documentação diz isso.
No Java não foram implementados dessa forma, mas você poderia implementar algo nesse sentido.
Sugiro que dê uma olhada no fonte das classes HashMap e Hashtable.
Não, cada chave armazena um valor. Se você quer armazenar mais de um valor pra cada chave, então na realidade o seu valor terá de ser uma coleção de objetos, aí a cada inserção, você obtém a coleção para a chave informada e adiciona um elemento nela.