Returns a hash code for this string. The hash code for a String object is computed as
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
using int arithmetic, where s[i] is the ith character of the string, n is the length of the string, and ^ indicates exponentiation. (The hash value of the empty string is zero.)
ou seja ele usa exponenciação em conjunto com o valor ascii do caracter na implementação ou seja imagine a string “ab” a impl possivelmente será hash = valorAsciiA * 31 ^ tamanho - 1 + valorAsciiB * 31 ^ tamanho - 2 onde ^ = exponenciação
então a string “ba” irá retornar um hashcode diferente porq no cálculo é relacionado o código ascii com a exponenciação porq a fórmula seria esta: hash = valorAsciiB * 31 ^ tamanho - 1 + valorAsciiA * 31 ^ tamanho - 2
conseguiu enxergar que o resultado será diferente
faça o calculo no papel que vc conseguirá enxergar
assuma que o valor ascii de a é 97 e b é 98 só para testar.
só corrigindo é hash = valorAsciiA * 31 ^ tamanho - 1 + valorAsciiB * 31 ^ tamanho - 2 em vez de hash = valorAsciiA * 31 ^ 0 + valorAsciiB * 31 ^ 1
Como assim everton? A idéia é que a função hash tenha o menor número possível de colisões mesmo. Eu entendi o seguinte:
everton tenta entrar no conjunto. É calculado o hash. O hash não bate com nenhum elemento do conjunto (pois não há nenhum elemento no conjunto ainda). Logo, não é preciso compará-lo com equals. everton é adicionado no conjunto.
notreve tenta entrar no conjunto. É calculado o hash. O hash não bate com o hash de everton, então, não é preciso chamar equals (os objetos já são diferentes). notreve é adicionado no conjunto.
everton tenta entrar no conjunto. É calculado o hash. Já existe um elemento no conjunto que possui o mesmo hash do novo everton (esse elemento é o velho everton), logo, é necessário compará-los com equals também. O equals então é chamado e retorna verdadeiro. Logo, esse novo everton não é adicionado no conjunto.
joão tenta entrar no conjunto. É calculado o hash. Os hash de joão não bate com o hash de everton nem com o de notreve. Logo, eles já são diferentes. Não é preciso compará-los com equals. joão é adicionado no conjunto.
exatamente isso TiagoTC por isso que o método hashcode utiliza exponenciação no calculo por isso que quando alteramos a ordem das strings o resultado será diferente
De acordo com as explicações que vcs deram eu entendi perfeitamente e agredeço por sanar minha duvida, agora se eu nao me engano ou eu nao entendi bem e vou ler de novo no livro da Kathy Sierra estava falando que o hashCode de “amy” e “may” seriam os mesmos agora não sei se entendi errado ou estava isso mesmo, chegando em ksa vou ler novamente, mas de qualquer forma vlwww pelas explicações!!!