Em Java, obj.hashCode()
retorna algum valor. Qual é o uso desse código hash na programação?
Em Java, obj.hashCode()
retorna algum valor. Qual é o uso desse código hash na programação?
Respostas:
hashCode()
é utilizado para bucketing em Hash
implementaçõ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.
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?
hashCode()
método?
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
hashCode
mé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 dohashCode
mé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 ohashCode
mé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.)
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 ObjecthashCode()
não será mais válida. Portanto, se você substituir o método equals (), também deverá substituir ohashCode()
método.
Esta resposta é da documentação oficial do tutorial em Java SE 8
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 hashCode
mó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.
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.
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
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));
}
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.