HashSet (например, HashMap) использует, ну, хэширование, для достижения O (1) амортизируется устанавливает / тестирует / удаляет производительность. (В вопросе о некоторых ошибочных предположениях былоHashSet не использует хеширование.)
Теперь в Java все объекты являются "хэшируемыми" - то есть они имеют функцию hashCode()
(так как они являются потомками Объект ).Качество этой хеш-функции позволит алгоритму хеширования достичь ожидаемых характеристик производительности, описанных выше, «распределив объекты [равномерно] через сегменты».(Реализации объекта по умолчанию hashCode / равно сумма для идентификатора объекта. Как правило, это должно быть изменено для любого подкласса.)
Однако, если ваш класс плохо реализует hashCode
(например, возвращает 1 для всех значений), тогдапроизводительность HashSet / HashMap сильно пострадает в результате (для любого нетривиального n).Важно отметить, что hashCode
определяет сегмент , но equals
определяет, собственно, фактическое равенство, которое можно использовать , даже если хеш-код уникален и / или существуетнет коллизий (например, чтобы убедиться, что test / get не возвращает ложноположительный результат - его можно было бы устранить при установке / вставке без коллизий).
Просто следуйте инструкциямустановка требований в Object wrt.hashCode
и equals
или объекты могут быть потеряны.Плохая функция хеширования, которая соблюдает правила, все равно будет работать, хотя и с потенциально низкой производительностью.(Изменяемый объект особенно проблематичен для использования в хеш-ADT, потому что хеш-код и / или равенство не всегда могут быть стабильными.)