В 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 для каждого объекта.
Вот почему в настоящее время алгоритм хеширования является наиболее популярным алгоритмом поиска.