Существует ли структура хэша Java только с ключами и без значений? - PullRequest
36 голосов
/ 20 января 2009

Я ищу структуру, которая хэширует ключи, не требуя значения. При запросе он должен вернуть true, если ключ найден, и false в противном случае. Я ищу что-то похожее на Hashtable<MyClass, Boolean> за исключением того, что для вставки требуется только ключ, а запросы всегда возвращают истину или ложь, но не ноль.

Ответы [ 4 ]

74 голосов
/ 20 января 2009

Вам нужен Java HashSet .

Описание от официальной документации :

Этот класс реализует интерфейс Set, поддерживаемый хеш-таблицей (на самом деле экземпляр HashMap). Это не дает никаких гарантий относительно порядок итераций множества; в частности, это не гарантирует, что порядок останется неизменным со временем. Этот класс допускает нуль элемент.

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

Обратите внимание, что эта реализация не синхронизирована. Если несколько потоков получить доступ к хэшу, установленному одновременно, и хотя бы к одному из потоков изменяет набор, он должен быть синхронизирован извне. Это обычно достигается путем синхронизации на некотором объекте, который, естественно, инкапсулирует набор. Если такого объекта не существует, набор должен быть «обернутый» с использованием метода Collections.synchronizedSet. Это лучше сделано во время создания, чтобы предотвратить случайный несинхронизированный доступ к набор:

Set s = Collections.synchronizedSet (new HashSet (...));

Итераторы, возвращаемые методом итератора этого класса, работают быстро: если набор изменяется в любое время после создания итератора, в любым способом, кроме как через собственный метод удаления итератора, итератор генерирует исключение ConcurrentModificationException. Таким образом, перед лицом одновременная модификация, итератор быстро и чисто дает сбой, вместо того, чтобы рисковать произвольным, недетерминированным поведением в неопределенное время в будущем.

Обратите внимание, что отказоустойчивое поведение итератора не может быть гарантировано поскольку вообще невозможно сделать какие-либо жесткие гарантии при наличии несинхронизированной параллельной модификации. Нормально-быстро итераторы создают исключение ConcurrentModificationException основа. Поэтому было бы неправильно писать программу, которая зависела на этом исключении для его правильности: отказоустойчивое поведение итераторы должны использоваться только для обнаружения ошибок.

Этот класс является членом Java Collections Framework.

14 голосов
/ 20 января 2009

java.util.HashSet? Использование Содержит () для вашего поиска.

2 голосов
/ 05 марта 2009

См. Также статические методы Collections#newSetFromMap, которые создают набор на основе данной реализации карты. Это, например, удобно для создания слабого хеш-набора.

0 голосов
/ 07 января 2010

Java Set предназначен для удаления дубликатов, и, надеюсь, HashMap должен использовать Java Set для управления ключом, поскольку ключи никогда не могут иметь дубликаты, поэтому вы должны рассмотреть возможность установки для своих требований.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...