2016-02-27 2 views
6

Я понимаю HashSet на основе HashMap, так как они очень похожи. Это делает код более гибким и минимизирует усилия по внедрению. Однако одна ссылочная переменная в HashSet Entry представляется мне ненужной, если класс запрещает элемент null, поэтому вся запись не имеет смысла. Несмотря на этот факт, Entry занимает 24 байта памяти/элемента, тогда как один массив с элементами набора будет принимать только 4 байта/элемент, если мои цифры верны. (кроме заголовка массива)Производительность Java HashSet

Если мои аргументы верны, имеют ли преимущества избыточный вес этой производительности?

(если я ошибаюсь, я бы извлечь из него как хорошо)

+1

Единый массив не будет HashSet. Как бы вы имели O (1) contains() с простым массивом? –

+2

@JBNizet линейное зондирование (или вообще открытая адресация) работает только с одним массивом. Мне также интересно, что такое дизайнерское решение, но я не уверен, найдем ли мы автора здесь, чтобы сообщить ;-) –

+1

@JBNizet Вы можете легко реализовать несколько типов хеш-таблиц в массиве, то есть кукушку, линейку и т. Д. ... EDIT: linear не имеет O (1) содержит(), но cuckoo делает –

ответ

1

Хотя этот вопрос, в первую очередь на основе мнений, я суммировать несколько точек на тему:

  • HashSet появился в Java 1.2 много лет назад. Трудно догадаться, почему именно точные причины принятия проектных решений в то время, но ясно, что Java не использовался для высоконагруженных приложений; производительность играет меньшую роль, чем простота.
  • Вы правы, что HashSet является неоптимальным в потреблении памяти. Проблема известна, зарегистрирована ошибка JDK-6624565, и время от времени проводятся обсуждения на уровне core-libs-dev. Но является ли это блокировщиком для многих приложений реального мира? Вероятно, не.
  • Для тех редких приложений, где использование HashSet неприемлемо, есть уже хорошие альтернативы, такие как trove THashSet.
  • Обратите внимание, что алгоритмы открытой адресации имеют свои недостатки, например. значительное снижение производительности с коэффициентами нагрузки, близкими к 1; трудности с удалением элементов. См. related answer.

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

  • Нет связанных вопросов^_^