entender
O objetivo do hashCode () é obter o código de hash, também conhecido como código de hash; Na verdade, ele retorna um inteiro int. A função desse código de hash é determinar a posição do índice do objeto na tabela de hash.
hashcode () é definido no objeto JDK.java, o que significa que qualquer classe em java contém a função hashcode ().
Embora cada classe Java contenha uma função hashcode (). No entanto, o HashCode () da classe é útil apenas ao criar e criar uma "tabela de hash" (consulte a descrição abaixo para "tabela de hash") (a função é determinar a posição de cada objeto da classe na tabela de hash; em outros casos (por exemplo, criar um único objeto da classe ou criar uma matriz de objeto da classe, etc.), não.
A lista de hash acima refere -se a: aulas nas coleções Java que são essencialmente listas de hash, como hashmap, hashtable e hashset.
Em outras palavras: o hashcode () é útil apenas nas hashlists, mas é inútil em outros casos. A função do hashcode () em uma tabela de hash é obter o código de hash do objeto e, em seguida, determinar a posição do objeto na tabela de hash.
Todos sabemos que uma tabela de hash armazena pares de valor-chave, que são caracterizados por: ele pode recuperar rapidamente os "valores" correspondentes com base em "chaves". Isso usa o código de hash!
A essência de uma tabela de hash é implementada através de uma matriz. Quando queremos obter um certo "valor" em uma tabela de hash, na verdade queremos obter o elemento em uma determinada posição na matriz. A posição da matriz é obtida por "chave"; Além disso, a posição da matriz é calculada pelo código de hash correspondente à "chave".
Abaixo, tomaremos o hashset como exemplo para explicar em profundidade o papel do hashcode ().
Suponha que já existam 1000 elementos no hashset. O que devo fazer ao inserir o 1001º elemento? Como o hashset é uma coleção de conjuntos, ele permite elementos duplicados.
"Compare o 1001º elemento um por um com os 1000 elementos anteriores"? Obviamente, essa eficiência é igualmente ineficiente. A tabela de hash resolve esse problema muito bem. Ele calcula a posição do elemento na tabela de hash com base no código de hash e, em seguida, insere o elemento nessa posição. Para o mesmo elemento, naturalmente, apenas um é salvo.
A partir disso, podemos ver que, se dois elementos são iguais, seus códigos de hash devem ser iguais; Mas o contrário não é. Em uma mesa de hash,
1. Se dois objetos forem iguais, seus valores hashcode () devem ser os mesmos;
2. Se os dois objetos hashcode () forem iguais, eles não são necessariamente iguais.
Nota: Este é o caso nas tabelas de hash. Isso deve ser verdade nas listas de não hash!
Exemplo
Vamos dar uma olhada em um exemplo específico.
classe pública hashtest {private int i; public int geti () {return i; } public void seti (int i) {this.i = i; } public int hashCode () {return i % 10; } public final estático void main (string [] args) {hashtest a = novo hashtest (); Hashtest b = novo hashtest (); a.seti (1); b.seti (1); SET <HASHTEST> set = new HashSet <Hashtest> (); set.add (a); set.add (b); System.out.println (a.hashcode () == b.hashcode ()); System.out.println (A.Equals (b)); System.out.println (set); }}O resultado desta saída:
verdadeiro false [com.ubs.sae.test.hashtest@1, com.ub.sae.test.hashtest@1]
No exemplo acima, apenas reescrevemos o método HashCode. A partir dos resultados acima, podemos ver que, embora os códigos de hash dos dois objetos sejam iguais, os dois objetos não são realmente iguais;, não reescrevemos o método igual e, em seguida, chamamos o método padrão do objeto, para comparar se as referências dos dois objetos são os mesmos e mostram que esses são dois objetos diferentes e as referências das duas objeto. Aqui, colocamos o objeto gerado no hashset, e apenas o objeto exclusivo pode ser armazenado no hashset, ou seja, o mesmo objeto (aplicável ao método igual) armazenará apenas um, mas aqui existem dois objetos A e B que são colocados no hashset, de modo que o hashset perde seu próprio significado.
Neste momento, adicionamos o método igual:
classe pública hashtest {private int i; public int geti () {return i; } public void seti (int i) {this.i = i; } <span style = "cor:#3366ff;"> <strong> public boolean é igual (objeto objeto) {if (object == null) {return false; } if (object == this) {return true; } if (! (Object instância do hashtest)) {return false; } Hashtest Other = (hashtest) objeto; if (other.geti () == this.geti ()) {return true; } retornar false; } </strong> </span> public int hashCode () {return i % 10; } public final estático void main (string [] args) {hashtest a = novo hashtest (); Hashtest b = novo hashtest (); a.seti (1); b.seti (1); SET <HASHTEST> set = new HashSet <Hashtest> (); set.add (a); set.add (b); System.out.println (a.hashcode () == b.hashcode ()); System.out.println (A.Equals (b)); System.out.println (set); }}Os resultados obtidos neste momento serão os seguintes:
true true [com.ubs.sae.test.hashtest@1]
A partir dos resultados, podemos ver que os dois objetos agora são completamente iguais e apenas um objeto é armazenado no hashset.
Resumir
1. A existência do HashCode é usada principalmente para pesquisar a rapidez, como hashtable, hashmap, etc. O código de hash é usado para determinar o endereço de armazenamento de um objeto na estrutura de armazenamento de hash;
2. Se os dois objetos forem iguais, é aplicável ao método igual (java.lang.object), os códigos de hash desses dois objetos devem ser os mesmos;
3. Se o método igual do objeto for reescrito, o código de hash do objeto também deve ser reescrito o máximo possível, e o objeto usado pelo HashCode deve ser consistente com o mesmo que o método igual, ele violará o segundo ponto mencionado acima;
4. O código de hash de dois objetos é o mesmo, o que não significa necessariamente que os dois objetos são iguais, ou seja, não se aplica necessariamente ao método igual (java.lang.Object). Só pode indicar que esses dois objetos estão em uma estrutura de armazenamento de hash, como a hashtable, e são "armazenados na mesma cesta".