Collection Framework - Вопросы

Всего: 7 вопросов

1. 

В какой версии Java появился Collection Framework?

Collection Framework появился в JDK 1.2 (J2SE 1.2, 1998 год). До этого в Java были только классы Vector, Stack и Hashtable из Java 1.0 — позже их встроили в новую иерархию. Обобщённые типы (generics) коллекции получили в Java 5.

2. 

В каких значениях используется слово «коллекция» в Java?

- структура данных, в которой хранятся объекты (список, множество, очередь, отображение)

- интерфейс java.util.Collection — корень ветки списков, множеств и очередей

- служебный класс java.util.Collections со статическими методами для работы с коллекциями (sort(), reverse(), unmodifiableList(), synchronizedMap())

3. 

Какие основные интерфейсы входят в Collection Framework?

Четыре базовых интерфейса — List, Set, Queue и Map. List, Set и Queue расширяют Collection (а он — Iterable); Map хранит пары «ключ–значение» и образует отдельную ветку, которая Collection не наследует.

С учётом подынтерфейсов основных интерфейсов шесть: List, Set, SortedSet/NavigableSet, Queue, Deque и Map.

4. 

Из каких частей состоит Collection Framework в Java?

Collection Framework из пакета java.util состоит из трёх частей:

  • Интерфейсы описывают, что умеет коллекция: Collection, List, Set, Queue, Deque, Map.
  • Реализации — классы с конкретной структурой данных внутри: ArrayList, LinkedList, HashSet, TreeSet, ArrayDeque, HashMap.
  • Алгоритмы — статические методы служебных классов Collections и Arrays: sort(), binarySearch(), shuffle(), max().

Переменную принято объявлять типом интерфейса: List<String> names = new ArrayList<>();. Тогда реализацию можно заменить одной строкой.

5. 

Чем отличаются Arrays.asList(), Collections.unmodifiableList(), List.of() и List.copyOf()?

  • Arrays.asList(...) возвращает список фиксированного размера поверх массива: set() работает и меняет массив, а add() и remove() бросают UnsupportedOperationException. null-элементы допустимы.
  • Collections.unmodifiableList(list) — представление только для чтения: все изменяющие методы бросают UnsupportedOperationException, но изменения исходного списка через него видны.
  • List.of(...) (Java 9) создаёт по-настоящему неизменяемый список без связи с источником; null-элементы запрещены (NullPointerException, даже у contains(null)).
  • List.copyOf(collection) (Java 10) делает неизменяемую копию, поэтому последующие изменения источника не видны; null тоже запрещён.

Если нужен обычный изменяемый список с начальными элементами, оберните фабрику: new ArrayList<>(List.of("a", "b")).

6. 

Какие потокобезопасные коллекции есть в Java вместо ArrayList и HashMap?

ArrayList, HashSet и HashMap не потокобезопасны: при одновременной записи из нескольких потоков данные теряются. Альтернативы делятся на три группы:

  • Унаследованные синхронизированные классы Vector и Hashtable — только для старого кода.
  • Обёртки Collections.synchronizedList() и Collections.synchronizedMap() с одной блокировкой на все методы; перебор нужно вручную заключать в synchronized (list) { ... }.
  • Классы пакета java.util.concurrent (Java 5): ConcurrentHashMap (основной выбор для общей Map, null-ключи и значения запрещены), CopyOnWriteArrayList (много чтений, редкие изменения), ConcurrentLinkedQueue, реализации BlockingQueue для схемы «производитель–потребитель», ConcurrentSkipListMap/ConcurrentSkipListSet вместо TreeMap/TreeSet.
7. 

Что такое SequencedCollection в Java 21?

SequencedCollection — интерфейс, добавленный в Java 21 (JEP 431) вместе с SequencedSet и SequencedMap. Он описывает коллекции с определённым порядком элементов и даёт им общие методы getFirst(), getLast(), addFirst(), addLast(), removeFirst(), removeLast() и reversed().

Эти интерфейсы расширяют List, Deque, SortedSet и SortedMap, а реализуют также LinkedHashSet и LinkedHashMap. Поэтому на Java 21 у обычного ArrayList есть list.getFirst(), а на Java 17 этот вызов не скомпилируется — там пишут list.get(0).

Страница 1 из 1