Collection Framework - Вопросы
Всего: 7 вопросов
1. В какой версии Java появился Collection Framework?
В какой версии 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?
- структура данных, в которой хранятся объекты (список, множество, очередь, отображение)
- интерфейс java.util.Collection — корень ветки списков, множеств и очередей
- служебный класс java.util.Collections со статическими методами для работы с коллекциями (sort(), reverse(), unmodifiableList(), synchronizedMap())
3. Какие основные интерфейсы входят в Collection Framework?
Какие основные интерфейсы входят в 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?
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(), 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?
Какие потокобезопасные коллекции есть в 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?
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).