хеш хава - PullRequest
       6

хеш хава

1 голос
/ 12 января 2010

hashCode элемента Java Hashtable всегда уникален?

Если нет, как я могу гарантировать, что один поиск даст мне нужный элемент?

Ответы [ 5 ]

5 голосов
/ 12 января 2010

Не обязательно. Два разных (и не равных) объекта могут иметь одинаковый хеш-код.

1 голос
/ 12 января 2010

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

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

Если вы используете строку в качестве ключа, вы не беспокоитесь,

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

1 голос
/ 12 января 2010

Из документации Java :

Общий контракт hashCode:

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

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

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

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

Так что да, обычно вы можете ожидать, что значение по умолчанию hashCode для объекта будет уникальным. Однако, если метод был переопределен классом, который вы храните в Hashtable, все ставки отключены.

0 голосов
/ 12 января 2010

hashCode элемента Java Hashtable всегда уникален?

Они должны.По крайней мере, в одном классе.

Если нет, как я могу гарантировать, что один поиск даст мне нужный элемент?

Указав себе хорошее hasCodeреализация для вашего класса: Переопределить equals () и hashCode

0 голосов
/ 12 января 2010

В идеале да. В действительности, столкновения случаются иногда.

...