HashSet поддерживается HashMap. От его JavaDoc:Должны ли мы использовать HashSet?
Этот класс реализует интерфейс Set, поддержанный хэш-таблицу (фактически экземпляр HashMap)
Когда взглянуть на источник, мы также можем видеть, как они относятся к друг с другом:
// Dummy value to associate with an Object in the backing Map
private static final Object PRESENT = new Object();
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
Поэтому HashSet<E>
опирается на HashMap<E,Object>
. Для всех HashSets в нашем приложении у нас есть один ссылочный объект PRESENT
, который мы используем в значении HashMap
. Хотя память, необходимая для хранения PRESENT
, пренебрежимо мала, мы все равно сохраняем ссылку на нее для каждого значения на карте.
Не эффективнее было бы использовать null
вместо PRESENT
? Далее следует рассмотреть вопрос об отказе от HashSet
и непосредственно использовать HashMap
, учитывая обстоятельства, позволяющие использовать Map
вместо Set
.
Моя основная проблема, что вызвало эти мысли следующая ситуация: У меня есть коллекция объектов на со следующими свойствами:
- большая коллекция объектов> 30'000
- порядок вставки не имеет значения
- Эффективная проверка, если элемент содержится
- Добавление новых элементов в коллекции не имеет значения выбранное решение должно выполнить оптимальным в контексте к указанным выше критериям, а также свести к минимуму CO памяти nsumption. Исходя из этого, на память приходят данные
HashSet
иHashMap
. Размышляя об альтернативных подходах, ключевой вопрос:
Как эффективно проверить containement?
Единственный ответ, который приходит мне на ум, заключается в использовании хеш-элементов для вычисления места хранения. Возможно, я что-то пропустил. Есть ли другие подходы?
Я имел взгляд на различные вопросы, которые даже пролить свет на вопрос, но не спокойно ответил на мой вопрос:
- Java : HashSet vs. HashMap
- clarifying facts behind Java's implementation of HashSet/HashMap
- Java HashSet vs HashMap
I я не ищу предложений о каких-либо альтернативных библиотеках или рамках для решения этой проблемы, но я хочу понять, есть ли другой способ подумать об эффекте проверка содержимого элемента в Collection
.
Зачем использовать 'null'? AFAIK, 'containsKey' в' HashMap' проверяет, '' get' возвращает 'null', поэтому это сломает несколько вещей. – Moira
1) Это может быть проблемой для хранения «null» в HashMap - это нарушает контракт. 2) Я думаю, что для ссылки «null» требуется такой же объем памяти, что и ссылка на любой другой объект, поэтому нет никакой прибыли. – dbf
Вопрос в том, что именно эта точка: Почему бы не использовать значение 'null' как значение в' HashMap'? – hotzst