Как работают HashSets в Java?

Возможный дубликат:
Как работает hashmap Java?

Может кто-нибудь объяснить мне, как HashSets в java работают и почему они быстрее, чем использование ArrayLists?

Ответы

Ответ 1

Во-первых, HashSet, в отличие от ArrayList является Set: он не может содержать дубликаты, а ArrayList может - поэтому они построены для разных целей. Он также не гарантирует упорядочение - опять же, в отличие от списка.

Второй - a HashSet построен на структуре данных хеш-таблицы, которая позволяет O(1) искать время для элемента.

Обратите внимание, что много раз < <20 > медленнее, тогда ArrayList - если вы хотите итерации на элементах, например, обычно делаете это в ArrayList будет быстрее, чем в HashSet [из-за плохой производительности кеша хэш, среди прочих причин]

Ответ 2

A HashSet на самом деле a HashMap, где значение всегда одно и то же.

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

HashSet просто содержит ключи, поэтому .contains(..) - O(1). Это и remove(..) являются единственными операциями a HashSet быстрее, чем ArrayList (что является O (n)). Итерация такая же, добавление одно и то же.

Ответ 3

Это две разные структуры данных.

Концепция HashSet - это ключевое исследование.
То есть вы используете преобразование входного ключа для получения индекса местоположения значения в массиве.
Это постоянная операция O(1), так как массив допускает произвольный доступ.

Аррайалист также работает O(1) для доступа, так как он также поддерживается массивом. Но только для случайного доступа и вставки.

поиск хотя есть O(N) Работа для ArrayList, так как вы должны искать через все elemements в списке, чтобы добраться до значения в отличие от HashSet, где вы просто преобразовать ключ и доступ к массиву. Поиск в HashSet равен O(1)

Ответ 4

На самом деле, например, повторение и добавление в ArrayList происходит быстрее.

И черт возьми, вы даже не можете сортировать HashSet.

Но самым быстрым из всех является NoOp. Нет ничего просто удаленно так же быстро, как NoOp. Конечно, это не так много, NoOp. Но это действительно быстро!

Вам нужно быть более точным в том, что вы считаете "быстрее, чем".