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