web-dev-qa-db-fra.com

Quelle est l'utilisation de hashCode en Java?

En Java, obj.hashCode() renvoie une valeur. Quelle est l'utilisation de ce code de hachage en programmation?

129
Vinoth Kumar

hashCode() est utilisé pour bucketing in Hash, comme HashMap, HashTable, HashSet, etc.

La valeur reçue de hashCode() est utilisée en tant que numéro de compartiment pour stocker les éléments de l'ensemble/la carte. Ce numéro de compartiment est l'adresse adresse de l'élément à l'intérieur de l'ensemble/de la carte.

Lorsque vous exécuterez contains(), le code de hachage de l'élément sera pris, puis le compartiment où pointe le code de hachage. Si plus d'un élément est trouvé dans le même compartiment (plusieurs objets peuvent avoir le même code de hachage), il utilise la méthode equals() pour évaluer si les objets sont égaux, puis décide si contains() est vrai ou faux, ou décide si élément pourrait être ajouté dans l'ensemble ou non.

183
aishu

Depuis le Javadoc :

Renvoie une valeur de code de hachage pour l'objet. Cette méthode est prise en charge au profit des tables de hachage telles que celles fournies par Java.util.Hashtable

Le contrat général de hashCode est: 

  • Chaque fois qu'elle est appelée plusieurs fois sur le même objet lors de l'exécution d'une application Java, la méthode hashCode doit toujours renvoyer le même entier, à condition qu'aucune information utilisée dans les comparaisons égales de l'objet ne soit modifiée. Cet entier n'a pas besoin de rester cohérent d'une exécution d'une application à une autre exécution de la même application. 

  • Si deux objets sont égaux selon la méthode equals(Object), l'appel de la méthode hashCode sur chacun des deux objets doit produire le même résultat entier. 

  • Il est non obligatoire que si deux objets ne soient pas égaux selon la méthode equals(Java.lang.Object), l'appel de la méthode hashCode sur chacun des deux objets doit produire des résultats entiers distincts. Cependant, le programmeur doit savoir que la production de résultats entiers distincts pour des objets inégaux peut améliorer les performances des hashtables. 

Dans la mesure du possible, la méthode hashCode définie par la classe Object renvoie des entiers distincts pour des objets distincts. (Ceci est généralement implémenté par conversion de l'adresse interne de l'objet en un entier}, mais cette technique d'implémentation n'est pas requise par le langage de programmation Java.) 

28
John Topley

La valeur renvoyée par hashCode() est le code de hachage de l'objet, qui correspond à l'adresse mémoire de l'objet en hexadécimal.

Par définition, si deux objets sont égaux, leur code de hachage doit également être égal. Si vous substituez la méthode equals(), vous modifiez la façon dont deux objets sont assimilés et l'implémentation de Object de hashCode() n'est plus valide. Par conséquent, si vous substituez la méthode equals (), vous devez également redéfinir la méthode hashCode().

Cette réponse provient de la documentation officielle du didacticiel Java SE 8

12
eliscolatour

hashCode() est une fonction qui prend un objet et génère une valeur numérique. Le hashcode d'un objet est toujours le même si l'objet ne change pas.

Des fonctions telles que HashMap, HashTable, HashSet, etc. qui ont besoin de stocker des objets utilisent un hashCode modulo la taille de leur tableau interne pour choisir la "position de mémoire" (c'est-à-dire la position du tableau) dans laquelle stocker l'objet.

Il y a des cas où des collisions peuvent survenir (deux objets finissent avec le même hashcode), et cela, bien sûr, doit être résolu avec soin.

12
roottraveller

Bien que hashcode ne fasse rien avec votre logique métier, nous devons nous en occuper dans la plupart des cas. En effet, lorsque votre objet est placé dans un conteneur basé sur un hachage (HashSet, HashMap ...), le conteneur place/récupère le hashcode de l'élément.

7

Hashcode est un code unique généré par la machine virtuelle Java pour chaque création d'objet. Nous utilisons hashcode pour effectuer certaines opérations sur des algorithmes liés au hachage, tels que hashtable, hashmap, etc. un objet que le code unique aide à découvrir que obj. Mais nous ne pouvons pas dire que hashcode est l'adresse d'un obj. Il s'agit d'un code unique généré par la machine virtuelle Java pour chaque objet. C'est l'algorithme de hachage journalier qui est l'algorithme de recherche le plus populaire.

2
pritish sahu

Un hashcode est un nombre généré à partir de n'importe quel objet.

C'est ce qui permet aux objets d'être stockés/récupérés rapidement dans une table de hachage.

Imaginez le simple exemple suivant :

Sur la table devant toi. vous avez neuf boîtes portant chacune un chiffre de 1 à 9. Vous avez également une pile d'objets extrêmement différents à stocker dans ces boîtes, mais une fois qu'elles sont dedans, vous devez pouvoir les trouver le plus rapidement possible.

Ce dont vous avez besoin est un moyen de décider instantanément dans quelle boîte vous avez inséré chaque objet. Cela fonctionne comme un index. vous décidez de trouver le chou afin de chercher dans quelle boîte se trouve le chou, puis allez directement à cette boîte pour l'obtenir.

Imaginez maintenant que vous ne voulez pas vous soucier de l'index, vous voulez pouvoir savoir immédiatement à partir de l'objet dans lequel il vit.

Dans l'exemple, utilisons un moyen très simple de procéder: le nombre de lettres dans le nom de l'objet. Donc, le chou va à la case 7, le pois va à la case 3, la fusée à la case 6, le banjo à la case 5 et ainsi de suite.

Qu'en est-il des rhinocéros? Il comporte 10 caractères, nous allons donc modifier un peu notre algorithme et le "boucler" pour que les objets de 10 lettres soient placés dans la case 1, 11 lettres dans la case 2, etc. Cela devrait couvrir n'importe quel objet.

Parfois, une boîte contient plus d'un objet, mais si vous recherchez une fusée, il est encore beaucoup plus rapide de comparer une cacahuète et une fusée, que de contrôler un tas de choux, de pois, de banjos et de rhinocéros.

C'est un code de hachage. Un moyen d'obtenir un numéro d'un objet afin qu'il puisse être stocké dans une table de hachage. En Java, un code de hachage peut être n’importe quel nombre entier et chaque type d’objet est responsable de la génération de son propre. Recherchez la méthode "hashCode" de Object.

Source - ici

0
Satyajit Das

Une des utilisations de hashCode () est la construction d'un mécanisme de capture . Regardez cet exemple:

        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));
}
0
Sudabe-Neirizi