Qual é o uso do hashCode em Java?

Respostas:

222

hashCode()é utilizado para bucketing em Hashimplementações gosto HashMap, HashTable, HashSet, etc.

O valor recebido hashCode()é usado como o número do depósito para armazenar elementos do conjunto / mapa. Esse número do bloco é o endereço do elemento dentro do conjunto / mapa.

Quando você fizer contains()isso, usará o código de hash do elemento e, em seguida, procure o bucket para onde o código de hash aponta. Se mais de 1 elemento for encontrado no mesmo bloco (vários objetos podem ter o mesmo código de hash), ele utilizará o equals()método para avaliar se os objetos são iguais e, em seguida, decidir se contains()é verdadeiro ou falso, ou se o elemento pode ser adicionado no conjunto ou não.

aish
fonte
28
Oi amigo .. Resposta muito boa, mas eu encontrei um link muito interessante para o mesmo, com um exemplo prático fácil de entender: coderanch.com/t/321515/java/java/HashCode
Logicalj
Obrigado Aishu. Agora eu tenho um conhecimento claro sobre o hashcode com explicação relacionada ao bucket.
Balasubramani
2
"se mais de 1 elemento for encontrado no mesmo bucket .. então ele será usado equals()para avaliar", e daí se houver apenas um elemento correspondente de código hash encontrado, ele retornará true diretamente? mas como vários objetos podem ter o mesmo código de hash , é necessário executar equals()para avaliar se o elemento correspondente é igual; caso contrário, ele pode fornecer um resultado inesperado, estou certo?
Saorikido 23/03
Em contrapartida, o código hash é um método que o objeto chama para determinar a ordem de armazenamento de cada objeto na memória. Se os objetos forem iguais, seu código de hash também deverá ser igual. (o inverso desta afirmação é falso) #
NoName 24/06
1
Em que caso um programador chamaria manualmente o hashCode()método?
Cardinal - Restabelece Monica
33

Do Javadoc :

Retorna um valor de código de hash para o objeto. Este método é suportado para o benefício de tabelas de hash, como as fornecidas por java.util.Hashtable.

O contrato geral de hashCodeé:

  • Sempre que é invocado no mesmo objeto mais de uma vez durante a execução de um aplicativo Java, o hashCodemétodo deve retornar consistentemente o mesmo número inteiro , desde que nenhuma informação usada em comparações iguais no objeto seja modificada. Esse número inteiro não precisa permanecer consistente de uma execução de um aplicativo para outra execução do mesmo aplicativo.

  • Se dois objetos são iguais de acordo com o equals(Object)método, a chamada do hashCodemétodo em cada um dos dois objetos deve produzir o mesmo resultado inteiro.

  • Se ele não necessário que se dois objectos são desiguais de acordo com o equals(java.lang.Object)método, de seguida, chamar o hashCodemétodo em cada um dos dois objectos devem produzir resultados inteiros distintos. No entanto, o programador deve estar ciente de que a produção de resultados inteiros distintos para objetos desiguais pode melhorar o desempenho das hashtables.

Tanto quanto for razoavelmente prático, o método hashCode definido pela classe Object retorna números inteiros distintos para objetos distintos. (Isso geralmente é implementado convertendo o endereço interno do objeto em um número inteiro , mas essa técnica de implementação não é requerida pela linguagem de programação Java.)

John Topley
fonte
14

O valor retornado por hashCode()é o código de hash do objeto, que é o endereço de memória do objeto em hexadecimal.

Por definição, se dois objetos são iguais, seu código de hash também deve ser igual. Se você substituir o equals()método, alterará a maneira como dois objetos são equacionados e a implementação de Object hashCode()não será mais válida. Portanto, se você substituir o método equals (), também deverá substituir o hashCode()método.

Esta resposta é da documentação oficial do tutorial em Java SE 8

Eli
fonte
13

hashCode()é uma função que pega um objeto e gera um valor numérico. O código hash de um objeto é sempre o mesmo se o objeto não for alterado.

Funções como HashMap, HashTable, HashSet, etc. que precisam armazenar objetos vai usar um hashCodemódulo do tamanho de sua matriz interna para escolher no que "a posição de memória" (ie posição array) para armazenar o objeto.

Existem alguns casos em que colisões podem ocorrer (dois objetos acabam com o mesmo código de hash) e isso, é claro, precisa ser resolvido com cuidado.

roottraveller
fonte
6

Embora o hashcode não faça nada com sua lógica de negócios, precisamos cuidar disso na maioria dos casos. Porque quando seu objeto é colocado em um contêiner baseado em hash (HashSet, HashMap ...), o contêiner coloca / obtém o código hash do elemento.

卢 声 远 Shengyuan Lu
fonte
Não, não faz. Põe / pega a chave. O hashCode é usado apenas para o balde,
Marquis of Lorne
3

Um código de hash é um número gerado a partir de qualquer objeto.

É isso que permite que os objetos sejam armazenados / recuperados rapidamente em um Hashtable.

Imagine o seguinte exemplo simples :

Em cima da mesa à sua frente. você tem nove caixas, cada uma marcada com um número de 1 a 9. Você também tem uma pilha de objetos totalmente diferentes para armazenar nessas caixas, mas uma vez que eles estejam lá, será necessário encontrá-los o mais rápido possível.

O que você precisa é uma maneira de decidir instantaneamente em qual caixa você colocou cada objeto. Funciona como um índice. você decide encontrar o repolho para procurar em qual caixa está o repolho e depois vai direto para a caixa para obtê-lo.

Agora imagine que você não quer se preocupar com o índice, você deve descobrir imediatamente a partir do objeto em que caixa ele reside.

No exemplo, vamos usar uma maneira realmente simples de fazer isso - o número de letras no nome do objeto. Então o repolho entra na caixa 7, a ervilha entra na caixa 3, o foguete na caixa 6, o banjo na caixa 5 e assim por diante.

Mas e o rinoceronte? Ele tem 10 caracteres, portanto, mudaremos um pouco nosso algoritmo e "envolveremos" para que os objetos de 10 letras cheguem na caixa 1, 11 letras na caixa 2 e assim por diante. Isso deve cobrir qualquer objeto.

Às vezes, uma caixa terá mais de um objeto, mas se você estiver procurando por um foguete, ainda é muito mais rápido comparar um amendoim e um foguete do que verificar uma pilha inteira de repolhos, ervilhas, banjos e rinocerontes.

Esse é um código hash. Uma maneira de obter um número de um objeto para que ele possa ser armazenado em um Hashtable. Em Java, um código de hash pode ser qualquer número inteiro e cada tipo de objeto é responsável por gerar o seu próprio. Pesquise o método "hashCode" do Object.

Fonte - aqui

Satyajit Das
fonte
-1

Um dos usos de hashCode () é criar um mecanismo de captura . Veja este exemplo:

        class Point
    {
      public int x, y;

      public Point(int x, int y)
      {
        this.x = x;
        this.y = y;
      }

      @Override
      public boolean equals(Object o)
      {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Point point = (Point) o;

        if (x != point.x) return false;
        return y == point.y;
      }

      @Override
      public int hashCode()
      {
        int result = x;
        result = 31 * result + y;
        return result;
      }

class Line
{
  public Point start, end;

  public Line(Point start, Point end)
  {
    this.start = start;
    this.end = end;
  }

  @Override
  public boolean equals(Object o)
  {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;

    Line line = (Line) o;

    if (!start.equals(line.start)) return false;
    return end.equals(line.end);
  }

  @Override
  public int hashCode()
  {
    int result = start.hashCode();
    result = 31 * result + end.hashCode();
    return result;
  }
}
class LineToPointAdapter implements Iterable<Point>
{
  private static int count = 0;
  private static Map<Integer, List<Point>> cache = new HashMap<>();
  private int hash;

  public LineToPointAdapter(Line line)
  {
    hash = line.hashCode();
    if (cache.get(hash) != null) return; // we already have it

    System.out.println(
      String.format("%d: Generating points for line [%d,%d]-[%d,%d] (no caching)",
        ++count, line.start.x, line.start.y, line.end.x, line.end.y));
}
Sudabe-Neirizi
fonte
O que significa "construir um mecanismo de captura"? E como esse código ilustra isso?
Marquês de Lorne
-1

hashCode()é um código exclusivo que é gerado pela JVM para cada criação de objeto.

Usamos hashCode()para executar alguma operação em algoritmos relacionados a hash como Hashtable, Hashmap etc.

As vantagens de hashCode()facilitar a operação de pesquisa, porque quando pesquisamos um objeto com código exclusivo, ajuda a descobrir esse objeto.

Mas não podemos dizer que hashCode()é o endereço de um objeto. É um código exclusivo gerado pela JVM para cada objeto.

É por isso que hoje em dia o algoritmo de hash é o algoritmo de pesquisa mais popular.

Sahu Pritish
fonte
4
Hashcode não é exclusivo. 2 objetos desiguais podem retornar o mesmo código hash.
Ranielle Canlas 28/05/19