O cálculo de hash é calcular qual elemento deve ser colocado na matriz. Para ser preciso, é colocado na lista de links. De acordo com as regras do Java, se você deseja colocar um objeto em um hashmap, a classe do seu objeto deve fornecer um método HashCode e retornar um valor inteiro. Por exemplo, a classe String tem os seguintes métodos:
public int hashCode () {int h = hash; int len = count; if (h == 0 && len> 0) {int off = offset; char val [] = valor; for (int i = 0; i <len; i ++) {h = 31*h+val [off ++]; } hash = h; } retornar h; } Preste atenção ao loop acima, não é um pouco confuso? Deixe -me dar um exemplo para que seja fácil entender o que está fazendo. Por exemplo, existe uma string "ABCDE" que usa um método de cálculo de 31 dígitos para calcular a soma dessa string. Você escreverá a seguinte fórmula de cálculo:
a*31^4+b*31^3+c*31^2+d*31^1+e*31^0. Observe que A, B, C, D ou E aqui se referem aos seus valores ASCII. Loops muito interessantes, que podem ser usados para calcular o N-Digit. Este loop pode ser extraído separadamente como uma boa ferramenta para calcular a partição:
public static void main (string [] args) {int [] a = {1,0}; System.out.println (calcule (2, a)); } private static int calcular (int radix, int [] a) {int sum = 0; for (int i = 0; i <a.Length; ++ i) {sum = sum*radix+a [i]; } retornar soma; } O caculado do método estático aceita a Radix como a cardinalidade e a organização de A simula o número do cálculo a ser calculado, basta prestar atenção à ordem de superfície consistente. Por exemplo, a sequência binária 01 deve ser organizada na matriz de acordo com {0,1}. A saída acima é 1, que atinge o valor verdadeiro de 01.
Então, por que usar 31 como base? Primeiro, você precisa entender por que o HashCode é necessário. Cada objeto calcula o HashCode com base no valor. Embora esse tamanho de código não exija exclusividade (porque isso geralmente será muito lento), deve ser o máximo possível e não repetido possível, portanto a cardinalidade deve ser o mais grande possível. Além disso, 31*N podem ser otimizados pelo compilador para mudar para a esquerda em 5 bits e depois reduzir em 1, que tem maior desempenho. De fato, ainda é controverso escolher 31, consulte aqui.
Eu acho que essa coisa ainda levará a mais repetições e deve usar números maiores. Portanto, talvez haja algumas mudanças na implementação de Java no futuro. O artigo a seguir apresenta duas conclusões:
1. Use números primos para a cardinalidade
As características dos números primos (apenas 1 e por si só são fatores) podem tornar o resultado obtido multiplicando -o com outros números mais fáceis de produzir de singularidade do que outros métodos, ou seja, a probabilidade de conflito entre os valores do código de hash é o menor.
2. A escolha 31 é uma escolha depois de observar os resultados da distribuição. O motivo não está claro, mas é realmente benéfico.
Além disso, o primeiro valor calculado será armazenado em cache internamente, porque esta é uma classe final (imutável), ou seja, o conteúdo do objeto String não mudará. Isso pode melhorar o desempenho ao colocar o Hashmap várias vezes, mas parece ser de pouca utilidade.
Resumir
O exposto acima é sobre as razões pelas quais 31 coeficientes são usados ao definir o HashCode. Espero que seja útil para todos. Amigos interessados podem continuar se referindo a este site:
" Introdução detalhada para reescrever hashcode () e equals () métodos "
" Explicação detalhada das diferenças e conexões essenciais entre HashCode () e Equals () "
" Análise do código -fonte Java do uso de hashmap "
Se houver alguma falha, deixe uma mensagem para apontá -la. Obrigado amigos pelo seu apoio para este site!