Какая польза от hashCode в Java?


161

В Java obj.hashCode()возвращает некоторое значение. Какая польза от этого хеш-кода в программировании?


Этот вопрос добавляет еще несколько деталей. stackoverflow.com/questions/18078779/…
MaheshVarma

1
Хорошее объяснение дано на этот пост. eclipsesource.com/blogs/2012/09/04/...
Виджай Vankhede

Ответы:


222

hashCode()используется для bucketing в Hashреализации нравится HashMap, HashTable, HashSetи т.д.

Полученное значение hashCode()используется как номер сегмента для хранения элементов набора / карты. Этот номер сегмента является адресом элемента внутри набора / карты.

Когда вы это сделаете, contains()он возьмет хеш-код элемента, а затем отыщет область, на которую указывает хеш-код. Если в одном сегменте найдено более 1 элемента (несколько объектов могут иметь один и тот же хэш-код), он использует equals()метод для оценки, равны ли объекты, а затем решает, contains()является ли элемент истинным или ложным, или решает, может ли элемент добавлено в набор или нет.


28
Привет, приятель. Очень хороший ответ, но я нашел очень интересную ссылку для того же самого с простым для понимания практическим примером: coderanch.com/t/321515/java/java/HashCode
Logicalj

Спасибо Айшу. Теперь я получил четкие знания о хэш-коде с объяснением, связанным с ведром.
Баласубрамани

2
«если в одном сегменте найдено более 1 элемента ... тогда он использует equals()для оценки», так что, если найден только один элемент, соответствующий хэш-коду, он возвращает true напрямую? но поскольку несколько объектов могут иметь один и тот же хэш-код, поэтому он должен запускаться equals()для оценки, равен ли совпадающий элемент, иначе это может дать вам неожиданный результат, я прав?
Саорикидо

Если оставить в стороне, хэш-код - это метод, который объект вызывает для определения порядка хранения каждого объекта в памяти. Если объекты равны, то их хеш-код также должен быть равен. (обратное утверждение неверно)
NoName

1
В каком случае программист вручную вызывает hashCode()метод?
Кардинал - Восстановить Монику

33

Из Javadoc :

Возвращает значение хеш-кода для объекта. Этот метод поддерживается для использования хеш-таблиц, таких как те, что предоставляются java.util.Hashtable.

Генеральный договор hashCode:

  • Всякий раз, когда он вызывается для одного и того же объекта более одного раза во время выполнения приложения Java, hashCodeметод должен последовательно возвращать одно и то же целое число при условии, что никакая информация, используемая в сравнениях сравнения объекта, не изменяется. Это целое число не должно оставаться согласованным при выполнении одного приложения другим исполнением того же приложения.

  • Если два объекта равны в соответствии с equals(Object)методом, то вызов hashCodeметода для каждого из двух объектов должен давать одинаковый целочисленный результат.

  • Он не требует , что если два объекта неравен в соответствии с equals(java.lang.Object)методом, затем вызывая hashCodeметод на каждом из двух объектов должны производить различные результаты целочисленных. Тем не менее, программист должен знать, что выдача различных целочисленных результатов для неравных объектов может улучшить производительность хеш-таблиц.

Насколько это целесообразно, метод hashCode, определенный классом Object, возвращает разные целые числа для разных объектов. (Это обычно реализуется путем преобразования внутреннего адреса объекта в целое число , но этот метод реализации не требуется языком программирования Java.)


14

Возвращаемое значение hashCode()является хеш-кодом объекта, который является шестнадцатеричным адресом памяти объекта.

По определению, если два объекта равны, их хэш-код также должен быть равен. Если вы переопределите equals()метод, вы измените способ приравнивания двух объектов, и реализация Object hashCode()больше не будет действительной. Следовательно, если вы переопределяете метод equals (), вы также должны переопределить hashCode()метод.

Этот ответ взят из официальной учебной документации по java SE 8


13

hashCode()это функция, которая принимает объект и выводит числовое значение. Хеш-код для объекта всегда одинаков, если объект не изменяется.

Такие функции , как HashMap, HashTable, HashSetи т.д. , которые необходимо хранить объекты будут использовать по hashCodeмодулю размер их внутреннего массива , чтобы выбрать , в каком «положении памяти» (т.е. позиция массива) для хранения объекта.

В некоторых случаях могут возникать коллизии (два объекта заканчиваются одним и тем же хеш-кодом), и это, конечно, требует тщательного решения.


6

Хотя хэш-код ничего не делает с вашей бизнес-логикой, в большинстве случаев мы должны позаботиться об этом. Потому что, когда ваш объект помещается в контейнер на основе хеша (HashSet, HashMap ...), контейнер помещает / получает хеш-код элемента.


Нет, это не так. Он ставит / получает ключ. Хэш-код используется только для группирования,
маркиз Лорн

3

Хэш - код представляет собой число , генерируемое из любого объекта.

Это то, что позволяет быстро сохранять / извлекать объекты в Hashtable.

Представьте себе следующий простой пример :

На столе перед тобой. у вас есть девять коробок, каждая из которых помечена номерами от 1 до 9. У вас также есть куча совершенно разных объектов, которые нужно хранить в этих коробках, но как только они появятся, вам нужно будет найти их как можно быстрее.

То, что вам нужно, это способ мгновенного решения, в какой ящик вы поместили каждый объект. Он работает как индекс. Вы решаете найти капусту, чтобы посмотреть, в какой коробке находится капуста, а затем идите прямо к этой коробке, чтобы получить ее.

А теперь представьте, что вы не хотите беспокоиться об индексе, вы хотите, чтобы сразу же можно было узнать по объекту, в каком ящике он живет.

В этом примере давайте используем очень простой способ сделать это - количество букв в названии объекта. Таким образом, капуста идет в коробке 7, горох идет в коробке 3, ракета в коробке 6, банджо в коробке 5 и так далее.

А как насчет носорога? В нем 10 символов, поэтому мы немного изменим наш алгоритм и «обернемся» так, чтобы 10-буквенные объекты помещались в блок 1, 11 букв в блок 2 и так далее. Это должно охватывать любой объект.

Иногда в коробке может быть более одного объекта, но если вы ищете ракету, сравнить арахис и ракету гораздо быстрее, чем проверить целую кучу капусты, гороха, банджо и носорога.

Это хеш-код. Способ получения числа из объекта, чтобы его можно было сохранить в Hashtable. В Java хеш-код может быть любым целым числом, и каждый тип объекта отвечает за генерацию своего собственного. Поиск метода "hashCode" объекта.

Источник - здесь


-1

Одним из применений hashCode () является создание механизма Catching . Посмотрите на этот пример:

        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));
}

Что означает «создание ловушечного механизма»? И как этот код иллюстрирует это?
Маркиз Лорн

-1

hashCode()это уникальный код, который генерируется JVM для каждого создания объекта.

Мы используем hashCode()для выполнения некоторых операций с алгоритмом, связанным с хешированием, таким как Hashtable, Hashmap и т. Д.

Преимущества hashCode()упрощают поиск, потому что когда мы ищем объект с уникальным кодом, это помогает найти этот объект.

Но мы не можем сказать, hashCode()что это адрес объекта. Это уникальный код, сгенерированный JVM для каждого объекта.

Вот почему в настоящее время алгоритм хеширования является наиболее популярным алгоритмом поиска.


4
Хэш-код не уникален. 2 неравных объекта могут возвращать один и тот же хэш-код.
Раниэль Канлас
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.