Как получить единственный элемент из List и Set в Java?

Получение элемента после проверки размера коллекции, различия индексного доступа и итератора, поведение пустых коллекций и оговорка о конкурентных изменениях.

Короткий ответ

Что ответить на собеседовании

Если коллекция гарантированно содержит ровно один элемент, используйте list.get(0) или set.iterator().next(). Когда гарантия не задана, сначала проверьте size() == 1 и обработайте нарушение условия. В контракте Set нет индексного get, но отдельные реализации гарантируют порядок. Проверка размера и чтение не образуют атомарную операцию при конкурентных изменениях.

Подробный разбор

Ответ с пояснениями

Если по условию в коллекции ровно один элемент, для списка подойдет list.get(0), а для множества — set.iterator().next(). Это получение значения без удаления из коллекции. Если единственность не гарантирована, нужно проверить размер, а не просто взять первый встретившийся элемент.

Например, для уже определенных переменных list и set:

if (list.size() != 1) {
    throw new IllegalArgumentException("Expected one list element");
}
var fromList = list.get(0);

if (set.size() != 1) {
    throw new IllegalArgumentException("Expected one set element");
}
var fromSet = set.iterator().next();

В контракте List предусмотрен доступ по индексу. У пустого списка обращение к индексу ноль приводит к IndexOutOfBoundsException. Вызов next() у исчерпанного итератора приводит к NoSuchElementException.

В контракте Set индексного get нет. Однако неверно говорить, что любое множество обязательно неупорядочено: конкретные реализации могут гарантировать порядок, например вставки или сортировки. Для единственного элемента выбор порядка не влияет на результат.

Проверка hasNext() подтверждает лишь наличие следующего элемента, но не его единственность. Аналогично выбор первого элемента потока не проверяет требование «ровно один».

Наконец, size() и последующее чтение — отдельные действия. Если другой поток может изменить коллекцию между ними, нужна подходящая синхронизация либо согласованно полученный снимок. Сам по себе потокобезопасный класс не превращает произвольную последовательность вызовов в атомарную операцию.

Практика в реальном времени

Подготовьтесь к следующему собеседованию

Interview Boost учитывает вакансию, резюме и технологии и помогает сформулировать ответ прямо во время интервью.

Начать подготовку