Coleções Java – hashCode() e equals() – Como substituir o método equals() e hashcode() em Java?

Publicados: 2018-08-08
Coleções Java hashCode e iguais

equals() e hashCode() em Java são dois métodos fundamentais que são declarados na classe Object e parte ou biblioteca Java principal.

Se você tiver alguma das preocupações abaixo em Java, então você está no lugar certo.

  • Práticas Java -> Implementando equals
  • override – Substituindo equals e hashCode em Java
  • Como substituir o método equals () em java
  • Como substituir o método hashCode () em java
  • Como substituir o método equals e hashCode em Java
  • Como e por que substituir o método equals em Java
  • Por que sempre substituir hashcode() se substituir equals()?

Vamos dar uma olhada em um exemplo simples para entender primeiro Reference Equality e Logical Equality . O operador de igualdade (==) compara as referências (endereços na memória) das duas Strings como dois números diferentes – isso é conhecido como Reference equality .

Logical equality compara os dados dos objetos em vez do valor das referências.

Saída:

hashCode e equals estão intimamente relacionados:

  • se você substituir equals , deverá substituir hashCode .
  • hashCode deve gerar valores iguais para objetos iguais.
  • equals e hashCode devem depender do same set of significant fields . Você deve usar o mesmo conjunto de campos em ambos os métodos. Você não é obrigado a usar todos os campos. Por exemplo, um campo calculado que depende de outros provavelmente deve ser omitido de equals e hashCode .

Ao implementar equals , os campos são comparados de forma diferente, de acordo com seu tipo:

  • campos de objeto, incluindo coleções: use equals
  • enumerações de tipo seguro: use equals ou == (elas equivalem à mesma coisa, neste caso)
  • campos de objeto possivelmente nulos: use ambos == e igual
  • campos de matriz: use Arrays.equals
  • campos primitivos diferentes de float ou double : use ==
  • float : converte para int usando Float.floatToIntBits , e use ==
  • double : converta para long usando Double.doubleToLongBits , então use ==

Implementando hashCode :

  • se uma classe substituir equals , ela deve substituir hashCode
  • quando ambos são substituídos, equals e hashCode devem usar o mesmo conjunto de campos
  • se dois objetos são iguais, seus valores de hashCode também devem ser iguais
  • se o objeto é imutável, então hashCode é um candidato para cache e inicialização lenta

É um equívoco popular que hashCode fornece um identificador exclusivo para um objeto. Isso não.

Por contrato geral, o método equals() em Java deve ser reflexivo, simétrico, transitivo, consistente e qualquer referência não nula deve retornar false. Em outras palavras, para valores arbitrários de a, b e c, os seguintes testes devem sempre passar:

Para a prática recomendada, use as etapas abaixo para implementar seu método equals():

  • Use this == that para verificar a igualdade de referência
  • Use instanceof para testar o tipo de argumento correto
  • Transmita o argumento para o tipo correto
  • Comparar campos significativos para igualdade

Aqui está um Exemplo Completo.

CrunchifyImplementEqualsHashCode.java

Saída do console do Eclipse: