2010-08-25 5 views
103

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

+0

Этот вопрос добавляет еще некоторые детали. http://stackoverflow.com/questions/18078779/what-is-the-purpose-of-hashcode-method-in-java – MaheshVarma

+0

приятное объяснение, данное на этом post.http: //eclipsesource.com/blogs/ 2012/09/04/the-3-things-you-should-know-about-hashcode/ – vsvankhede

ответ

24

От Javadoc:

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

Общий договор hashCode является:

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

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

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

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

7

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

147

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

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

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

+15

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

+0

Спасибо Aishu. Теперь я получил четкое представление о hashcode с объяснением, связанным с ведром. – Balasubramani

+0

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

5

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

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

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

-8

Метод hashCode для данного класса может использоваться для теста для объектного неравенства, но НЕ равенство объекта для этого класса.

Метод hashCode используется классом коллекции java.util.HashSet для группировки элементов внутри этого набора в хэш-ведра для быстрого поиска.

+4

Нет, не может. Два неравных объекта могут иметь один и тот же хэш-код, поэтому использование хеш-кодов для проверки неравенства даст ложные срабатывания. –

+0

@PranavMadhani - предлагаю либо исправить или удалить этот ответ ... – Krease

0

Hashcode - это уникальный код, который генерируется JVM для каждого создания объекта. Мы используем hashcode для выполнения некоторой операции с хэшированием, связанным с алгоритмом, таким как хеш-таблица, hashmap и т. Д. Преимущества хэш-кода - это упрощает поиск операции bcoz когда мы ищем объект, который уникальный код помогает узнать, что obj. Но мы не можем сказать, что hashcode является адресом obj. Это г уникальный код, генерируемый JVM для у каждого object..that теперь день алгоритм хэширования Z самым популярным алгоритмом поиска

2

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

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

This answer is from the java SE 8 official tutorial documentation

Смежные вопросы