Какие основные типы коллекций в Java и когда их использовать?

«Какие основные типы коллекций в Java и когда их использовать?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Коллекции Java делятся на три основные категории, каждая решает свою задачу.

1. List (Список)

Когда использовать: Когда важен порядок элементов и допустимы дубликаты. Доступ по индексу.

  • ArrayList: Используйте по умолчанию. Быстрый доступ по индексу (O(1)), но медленные вставки/удаления в середине (O(n)).
  • LinkedList: Используйте при частых вставках/удалениях в начале/середине (O(1)), но медленном доступе по индексу (O(n)). Также реализует Queue/Deque.

2. Set (Множество)

Когда использовать: Когда необходима гарантия уникальности элементов. Порядок зависит от реализации.

  • HashSet: Используйте по умолчанию для множества. Хранит элементы в произвольном порядке. O(1) для основных операций.
  • LinkedHashSet: Используйте, если нужен порядок вставки элементов. Немного медленнее HashSet.
  • TreeSet: Используйте, если элементы должны быть отсортированы. Основан на TreeMap. O(log n) для операций.

3. Map (Отображение)

Когда использовать: Для хранения пар ключ-значение. Ключи уникальны.

  • HashMap: Используйте по умолчанию. Быстрый доступ по ключу. Порядок не гарантирован.
  • LinkedHashMap: Порядок вставки или доступа (LRU-кэш).
  • TreeMap: Ключи отсортированы.

Пример выбора:

// 1. Список задач (порядок важен, дубликаты возможны)
List<String> toDoList = new ArrayList<>();
toDoList.add("Написать код");
toDoList.add("Протестировать");

// 2. Уникальные ID пользователей онлайн (уникальность важна, порядок нет)
Set<Long> onlineUserIds = new HashSet<>();
onlineUserIds.add(123L);
onlineUserIds.add(456L);

// 3. Кэш настроек пользователя по ID (быстрый поиск по ключу)
Map<Long, UserSettings> userSettingsCache = new HashMap<>();
userSettingsCache.put(123L, new UserSettings());

Для многопоточных сценариев используйте коллекции из java.util.concurrent (ConcurrentHashMap, CopyOnWriteArrayList).