2013-09-06 2 views
1

Если я использую HashMap, где ключи являются объектами определенного класса, то hashmap все еще дает производительность O (1)?Ошибка HashMap для пользовательских объектов?

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

+0

Неправильно. Не будет никаких коллизий (если только 'hashCode()' не переопределяется), поскольку реализация по умолчанию использует внутренний адрес объекта, который отличается для каждого объекта в куче Java. – gparyani

+0

Это действительно зависит от вашего алгоритма хэширования. – Surveon

+1

Если вы планируете вставлять свои объекты в структуру хэширования (например, 'HashMap' или' HashSet'), вы должны реально реализовать 'hashCode()' и 'equals()', контракты которых обсуждаются в ответе. – gparyani

ответ

1

O(1) не является точной сложностью поиска ключевых слов в HashMap его appox. Во-вторых, это зависит от того, как вы определяете свой метод hashCode() и equals.

Если вы следуете контракту, что 2 одинаковых объекта имеют один и тот же хэш-код, и если объекты имеют один и тот же хэш-код, тогда они могут быть или не быть равными, то да, вы достигнете этого appox. сложность O(1).

EDIT: Для обеспечения сложности O (1) вы должны обеспечить хорошую хеш-функцию для хорошего распределения.

+0

Я думаю, что он подразумевает, что он не реализовал эти методы, так как он говорит, что метод hashCode() 'возвращает внутренний адрес. – gparyani

+4

в соответствии с контрактом не обязательно означает, что вы сохраните O (1). Если они реализуют hashCode как «return 1;», то они сохраняют контракт equals/hashcode, но поиск hashmap превращается в линейный поиск. – digitaljoel

+0

согласился. Отредактировал мой ответ. – Lokesh

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