Ответ
HashSet не предоставляет метод get() по ключу, потому что он реализован поверх HashMap, где элементы HashSet хранятся в качестве ключей, а в качестве значений используется константа-заглушка.
Основные причины:
- Концептуальное несоответствие:
Set— это коллекция уникальных элементов, а не отображение «ключ-значение». Его основная задача — быстро отвечать на вопрос «содержится ли элемент?» (contains()), а не извлекать элемент по некому идентификатору. - Отсутствие смысла для "ключа": Чтобы использовать
get(key), вам уже нужна ссылка на искомый объект. Но если она у вас есть, вы можете просто проверить его наличие черезcontains(). Получение того же объекта по ссылке на него не имеет практического смысла. - Нарушение контракта Set: Добавление
get(key)размыло бы абстракцию множества, приблизив его кMap.
Как получить элемент, если известен его "образец"?
Если вам нужно найти элемент, равный заданному (по equals()), обойдите множество:
Set<Person> peopleSet = new HashSet<>();
peopleSet.add(new Person("Alice", 30));
Person searchTemplate = new Person("Alice", 30);
// Способ 1: Использовать поток (Java 8+)
Optional<Person> found = peopleSet.stream()
.filter(p -> p.equals(searchTemplate))
.findFirst();
// Способ 2: Итерация
Person result = null;
for (Person p : peopleSet) {
if (p.equals(searchTemplate)) {
result = p;
break;
}
}
Альтернативы:
- Если нужен доступ по ключу — используйте
HashMap<K, V>. - Если нужен доступ по индексу — используйте
ArrayList. - Если нужен предсказуемый порядок итерации — используйте
LinkedHashSet.