В Java obj.hashCode()возвращает некоторое значение. Какая польза от этого хеш-кода в программировании?
В Java obj.hashCode()возвращает некоторое значение. Какая польза от этого хеш-кода в программировании?
Ответы:
hashCode()используется для bucketing в Hashреализации нравится HashMap, HashTable, HashSetи т.д.
Полученное значение hashCode()используется как номер сегмента для хранения элементов набора / карты. Этот номер сегмента является адресом элемента внутри набора / карты.
Когда вы это сделаете, contains()он возьмет хеш-код элемента, а затем отыщет область, на которую указывает хеш-код. Если в одном сегменте найдено более 1 элемента (несколько объектов могут иметь один и тот же хэш-код), он использует equals()метод для оценки, равны ли объекты, а затем решает, contains()является ли элемент истинным или ложным, или решает, может ли элемент добавлено в набор или нет.
equals()для оценки», так что, если найден только один элемент, соответствующий хэш-коду, он возвращает true напрямую? но поскольку несколько объектов могут иметь один и тот же хэш-код, поэтому он должен запускаться equals()для оценки, равен ли совпадающий элемент, иначе это может дать вам неожиданный результат, я прав?
hashCode()метод?
Из Javadoc :
Возвращает значение хеш-кода для объекта. Этот метод поддерживается для использования хеш-таблиц, таких как те, что предоставляются
java.util.Hashtable.Генеральный договор
hashCode:
Всякий раз, когда он вызывается для одного и того же объекта более одного раза во время выполнения приложения Java,
hashCodeметод должен последовательно возвращать одно и то же целое число при условии, что никакая информация, используемая в сравнениях сравнения объекта, не изменяется. Это целое число не должно оставаться согласованным при выполнении одного приложения другим исполнением того же приложения.Если два объекта равны в соответствии с
equals(Object)методом, то вызовhashCodeметода для каждого из двух объектов должен давать одинаковый целочисленный результат.Он не требует , что если два объекта неравен в соответствии с
equals(java.lang.Object)методом, затем вызываяhashCodeметод на каждом из двух объектов должны производить различные результаты целочисленных. Тем не менее, программист должен знать, что выдача различных целочисленных результатов для неравных объектов может улучшить производительность хеш-таблиц.Насколько это целесообразно, метод hashCode, определенный классом Object, возвращает разные целые числа для разных объектов. (Это обычно реализуется путем преобразования внутреннего адреса объекта в целое число , но этот метод реализации не требуется языком программирования Java.)
Возвращаемое значение
hashCode()является хеш-кодом объекта, который является шестнадцатеричным адресом памяти объекта.По определению, если два объекта равны, их хэш-код также должен быть равен. Если вы переопределите
equals()метод, вы измените способ приравнивания двух объектов, и реализация ObjecthashCode()больше не будет действительной. Следовательно, если вы переопределяете метод equals (), вы также должны переопределитьhashCode()метод.
Этот ответ взят из официальной учебной документации по java SE 8
hashCode()это функция, которая принимает объект и выводит числовое значение. Хеш-код для объекта всегда одинаков, если объект не изменяется.
Такие функции , как HashMap, HashTable, HashSetи т.д. , которые необходимо хранить объекты будут использовать по hashCodeмодулю размер их внутреннего массива , чтобы выбрать , в каком «положении памяти» (т.е. позиция массива) для хранения объекта.
В некоторых случаях могут возникать коллизии (два объекта заканчиваются одним и тем же хеш-кодом), и это, конечно, требует тщательного решения.
Хотя хэш-код ничего не делает с вашей бизнес-логикой, в большинстве случаев мы должны позаботиться об этом. Потому что, когда ваш объект помещается в контейнер на основе хеша (HashSet, HashMap ...), контейнер помещает / получает хеш-код элемента.
Хэш - код представляет собой число , генерируемое из любого объекта.
Это то, что позволяет быстро сохранять / извлекать объекты в Hashtable.
Представьте себе следующий простой пример :
На столе перед тобой. у вас есть девять коробок, каждая из которых помечена номерами от 1 до 9. У вас также есть куча совершенно разных объектов, которые нужно хранить в этих коробках, но как только они появятся, вам нужно будет найти их как можно быстрее.
То, что вам нужно, это способ мгновенного решения, в какой ящик вы поместили каждый объект. Он работает как индекс. Вы решаете найти капусту, чтобы посмотреть, в какой коробке находится капуста, а затем идите прямо к этой коробке, чтобы получить ее.
А теперь представьте, что вы не хотите беспокоиться об индексе, вы хотите, чтобы сразу же можно было узнать по объекту, в каком ящике он живет.
В этом примере давайте используем очень простой способ сделать это - количество букв в названии объекта. Таким образом, капуста идет в коробке 7, горох идет в коробке 3, ракета в коробке 6, банджо в коробке 5 и так далее.
А как насчет носорога? В нем 10 символов, поэтому мы немного изменим наш алгоритм и «обернемся» так, чтобы 10-буквенные объекты помещались в блок 1, 11 букв в блок 2 и так далее. Это должно охватывать любой объект.
Иногда в коробке может быть более одного объекта, но если вы ищете ракету, сравнить арахис и ракету гораздо быстрее, чем проверить целую кучу капусты, гороха, банджо и носорога.
Это хеш-код. Способ получения числа из объекта, чтобы его можно было сохранить в Hashtable. В Java хеш-код может быть любым целым числом, и каждый тип объекта отвечает за генерацию своего собственного. Поиск метода "hashCode" объекта.
Источник - здесь
Одним из применений 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));
}
hashCode()это уникальный код, который генерируется JVM для каждого создания объекта.
Мы используем hashCode()для выполнения некоторых операций с алгоритмом, связанным с хешированием, таким как Hashtable, Hashmap и т. Д.
Преимущества hashCode()упрощают поиск, потому что когда мы ищем объект с уникальным кодом, это помогает найти этот объект.
Но мы не можем сказать, hashCode()что это адрес объекта. Это уникальный код, сгенерированный JVM для каждого объекта.
Вот почему в настоящее время алгоритм хеширования является наиболее популярным алгоритмом поиска.