Em primeiro lugar, para entender o papel do hashCode, primeiro você deve conhecer a coleção em Java.
De modo geral, existem dois tipos de coleções em Java, uma é Lista e a outra é Conjunto.
Você sabe a diferença deles? Os elementos do primeiro conjunto são ordenados e os elementos do último conjunto são desordenados, mas os elementos não podem ser repetidos;
Portanto, aqui está um problema mais sério: se quisermos garantir que os elementos não se repetem, qual deve ser a base para julgar se dois elementos se repetem?
Este é o método Object.equals. No entanto, se você verificar uma vez cada vez que um elemento for adicionado, quando houver muitos elementos, o número de comparações entre os elementos adicionados à coleção será muito grande.
Em outras palavras, se houver agora 1.000 elementos na coleção, quando o 1.001º elemento for adicionado à coleção, ele chamará o método equals 1.000 vezes. Obviamente, isso reduzirá bastante a eficiência.
Portanto, Java adota o princípio da tabela hash. Hash é na verdade o nome de uma pessoa porque ele propôs o conceito de algoritmo hash, que recebeu seu nome.
O algoritmo hash, também conhecido como algoritmo hash, atribui dados diretamente a um endereço de acordo com um algoritmo específico. Se você explicar o algoritmo hash em detalhes, o artigo exigirá mais comprimento, por isso não o apresentarei aqui.
Os iniciantes podem entender que o método hashCode na verdade retorna o endereço físico do armazenamento do objeto (na verdade, pode não ser o caso).
Desta forma, quando um novo elemento é adicionado à coleção, o método hashCode deste elemento é chamado primeiro, e o local físico onde ele deve ser colocado pode ser localizado imediatamente.
Se não houver nenhum elemento nesta posição, ele poderá ser armazenado diretamente nesta posição sem qualquer comparação; se já existir um elemento nesta posição,
Basta chamar seu método equals para compará-lo com o novo elemento. Se for igual, não será salvo. Se não for igual, outros endereços serão hash.
Portanto, há um problema de resolução de conflitos aqui. Dessa forma, o número de chamadas reais ao método equals é bastante reduzido, quase apenas uma ou duas vezes.
Portanto, Java fornece isso para o método eqauls e o método hashCode:
1. Se dois objetos forem iguais, então seus valores de hashCode devem ser iguais. 2. Se os hashCode de dois objetos forem iguais, eles não são necessariamente iguais. o método eqauls.
É claro que você não precisa fazer isso conforme solicitado, mas descobrirá que o mesmo objeto pode aparecer na coleção Set. Ao mesmo tempo, a eficiência da adição de novos elementos será bastante reduzida. O método hashcode é usado para determinar se dois objetos são iguais.
Então você diria, não existe um método chamado igual? Sim, esses dois métodos são usados para determinar se dois objetos são iguais. Mas eles são diferentes. De modo geral, o método equals é chamado pelo usuário se você deseja determinar se dois objetos são iguais.
Você pode substituir o método equals e chamá-lo em seu código para determinar se eles são iguais. Simplificando, o método equals é usado principalmente para determinar se dois objetos são iguais na superfície ou no conteúdo. Por exemplo, há uma turma de estudantes,
Os únicos atributos são nome e gênero, então podemos pensar que enquanto o nome e o gênero forem iguais, então os dois objetos serão iguais. O método hashcode geralmente não é chamado pelos usuários. Por exemplo, no hashmap, uma vez que a chave não pode ser repetida.
Quando ele julgou se a chave foi repetida, ele julgou o método hashcode e também usou o método equals. O que não pode ser repetido aqui significa que, desde que um dos iguais e o código hash não seja igual, tudo ficará bem! Simplificando, hashcode é equivalente à codificação de um objeto, assim como md5 em um arquivo. É diferente de equals porque retorna um tipo int, o que não é intuitivo em comparação. Geralmente sobrescrevemos o código hash ao substituir iguais para tornar sua lógica consistente. Por exemplo,
Ainda usando o exemplo agora, se o nome e o gênero forem iguais, mesmo que os dois objetos sejam iguais, então o método hashcode também deve retornar o valor hashcode do nome mais o valor hashcode do gênero, então logicamente, eles são consistentes .
Para determinar fisicamente se dois objetos são iguais, basta usar ==