понимать
Цель HashCode () состоит в том, чтобы получить хэш -код, также известный как хэш -код; Это фактически возвращает Int Integer. Функция этого хэш -кода состоит в том, чтобы определить позицию индекса объекта в хэш -таблице.
HashCode () определяется в объекте JDK. Java, что означает, что любой класс в Java содержит функцию HashCode ().
Хотя каждый класс Java содержит функцию HashCode (). Тем не менее, HashCode () класса полезен только при создании и создании «хэш -таблицы» (см. Описание ниже для «хэш -таблицы») (функция заключается в определении позиции каждого объекта класса в хэш -таблице; в других случаях (например, создание единого объекта класса или создание массива объектов класса и т. Д.), HASHCODE () нет () нет.
Приведенный выше список хэш относится к: классы в коллекциях Java, которые по существу являются хэш -списками, такими как Hashmap, Hashtable и Hashset.
Другими словами: hashcode () полезен только в хэш -линиях, но в других случаях бесполезен. Функция hashcode () в хэш -таблице заключается в получении хэш -кода объекта, а затем определить положение объекта в хэш -таблице.
Мы все знаем, что хэш-таблица хранит пары ключевых значений, которые характеризуются: она может быстро извлечь соответствующие «значения» на основе «клавиш». Это использует хэш -код!
Суть хеш -таблицы реализована через массив. Когда мы хотим получить определенное «значение» в хэш -таблице, мы действительно хотим получить элемент в определенной позиции в массиве. Положение массива получается «ключ»; Кроме того, положение массива рассчитывается хэш -кодом, соответствующим «ключ».
Ниже мы возьмем хэшсет в качестве примера, чтобы глубоко объяснить роль HashCode ().
Предположим, что в хешсете уже есть 1000 элементов. Что мне делать при вставке 1001 -й элемент? Поскольку Hashset является наборной коллекцией, он позволяет использовать дублирующие элементы.
«Сравните 1001 -й элемент один за другим с предыдущими элементами 1000»? Очевидно, эта эффективность одинаково неэффективна. Хэш -таблица очень хорошо решает эту проблему. Он рассчитывает положение элемента в хэш -таблице на основе хэш -кода, а затем вставляет элемент в эту позицию. Для того же элемента, естественно, только один сохранен.
Из этого мы можем видеть, что если два элемента равны, их хэш -коды должны быть равными; Но наоборот нет. В хэш -столе,
1. Если два объекта равны, то значения их хэшкода () должны быть одинаковыми;
2. Если два объекта hashcode () равны, они не обязательно равны.
Примечание: это так в хэш -таблицах. Это должно быть верно в не хэш -списках!
Пример
Давайте посмотрим на конкретный пример.
Общедоступный класс hashtest {private int i; public int geti () {return i; } public void seti (int i) {this.i = i; } public int hashcode () {return i % 10; } public final Static void main (string [] args) {hashtest a = new hashtest (); Hashtest b = new hashtest (); A.seti (1); B.Seti (1); Set <shashtest> set = new Hashset <shashtest> (); set.add (a); set.add (b); System.out.println (a.hashcode () == b.hashcode ()); System.out.println (A.Equals (b)); System.out.println (set); }}Результат этого вывода:
TRUE FALSE [com.ubs.sae.test.hashtest@1, com.ubs.sae.test.hashtest@1]
В приведенном выше примере мы просто переписываем метод хэшкода. Из приведенных выше результатов мы можем видеть, что, хотя хэшкоды двух объектов равны, два объекта на самом деле не равны;, мы не переписывали метод равных, а затем мы будем называть метод по умолчанию объекта, чтобы сравнить, являются ли ссылки на два объекта одинаковыми. Здесь мы поместили сгенерированный объект в хэшсет, и только уникальный объект может храниться в хэшсете, то есть тот же объект (применимый к методу равных), будет хранить только один, но здесь на самом деле существуют два объекта A и B, которые помещаются в хэшст, поэтому хэшсет теряет свое собственное значение.
В настоящее время мы добавляем метод равных:
Общедоступный класс hashtest {private int i; public int geti () {return i; } public void seti (int i) {this.i = i; } <span style = "color:#3366ff;"> <strong> public boolean equals (объект объекта) {if (object == null) {return false; } if (object == this) {return true; } if (! (Extance ObjectOf hashtest)) {return false; } Hashtest dise = (hashtest) объект; if (ore.geti () == this.geti ()) {return true; } вернуть false; } </strong> </span> public int hashcode () {return i % 10; } public final Static void main (string [] args) {hashtest a = new hashtest (); Hashtest b = new hashtest (); A.seti (1); B.Seti (1); Set <shashtest> set = new Hashset <shashtest> (); set.add (a); set.add (b); System.out.println (a.hashcode () == b.hashcode ()); System.out.println (A.Equals (b)); System.out.println (set); }}Результаты, полученные в это время, будут следующими:
Правда [com.ubs.sae.test.hashtest@1]
Из результатов мы видим, что эти два объекта теперь полностью равны, и только один объект хранится в хэшсете.
Суммировать
1. Существование хэшкода в основном используется для поиска быстроты, такого как хэштата, хэшмап и т. Д. Хашкод используется для определения адреса хранения объекта в структуре хэш -хранения;
2. Если два объекта одинаковы, это применимо к методу равных (java.lang.object), то хэшкоды этих двух объектов должны быть одинаковыми;
3. Если метод равных объекта переписан, то хэшкод объекта также должен быть переписан как можно больше, а объект, используемый HashCode
4. Хашкод двух объектов одинаков, что не обязательно означает, что два объекта одинаковы, то есть он не обязательно применяется к методу равных (java.lang.object). Это может только указывать на то, что эти два объекта находятся в хэш -структуре хранения, например, хэштата, и они «хранятся в одной корзине».