Collections. Lite. Flashcards
Что такое “коллекция”.
Коллекция — это структура данных для хранения ссылочных типов данных.
Java Collections Framework – это иерархия интерфейсов и их реализаций.
Перечислите основные методы из интерфейса java.util.Collection.
Основные:
- add()
- clear()
- contains()
- isEmpty()
- iterator()
- remove()
- size()
- toArray()
Остальные:
- addAll()
- containsAll()
- removeAll()
- retainAll()
- equals()
- hashCode()
Назовите преимущества использования коллекций по сравнению с массивами.
- Динамическое изменение размера.
- Готовые методы для работы с данными и сортировки.
- Возможность использовать разные типы коллекций (List, Set, Queue, Map).
- Реализуют различные алгоритмы и структуры данных.
- Возможность хранить данные без дублей или в упорядоченном виде.
Какие данные могут хранить коллекции?
- Любые ссылочные типы данных.
- Для примитивных типов используются классы-обёртки.
Какие есть типы коллекций? Как они характеризуются? Расскажите про иерархию коллекций List, Set, Map.
-
List: Упорядоченный список по порядку вставки элементов, допускаются дубликаты, доступ по индексу.
ArrayList - динамический массив, упорядочен, быстрый доступ по индексу.
LinkedList – двусвязный список, упорядочен, медленный доступ по индексу. -
Set: Множество - неупорядоченный набор уникальных элементов, нет доступа по индексу.
HashSet — неупорядоченная, основана на хеш-таблице, быстрая вставка, удаление, проверка наличия.
LinkedHashSet — упорядоченная по порядку вставки элементов, основана на хеш-таблице и связанном списке.
TreeSet — упорядоченная по Natural Order или Comparator, основана красно-чёрном дереве. -
Queue: Очередь - упорядочена, для хранения по принципу FIFO или приоритет.
LinkedList – очередь с поддержкой FIFO и LIFO.
PriorityQueue – упорядочена по приоритету элементов через Comparator.
ArrayDeque – реализация Deque, с поддержкой LIFO и FIFO. Более производительна, чем LinkedList. -
Map: Словарь - хранит пары “ключ-значение”, каждый ключ уникален, нет итератора.
HashMap – неупорядоченная, основана на хеш-таблице, быстрый доступ по ключам.
LinkedHashMap – упорядоченная по порядку вставки элементов, основана на хеш-таблице и связанном списке.
TreeMap – упорядоченная по ключам по Natural Order или Comparator, основана на сбалансированном дереве, реализует NavigableMap.
Назовите основные классы, которые имплементируют/реализуют интерфейсы List, Set, Map.
List:
- ArrayList
- LinkedList
Set:
- HashSet
- LinkedHashSet
- TreeSet
Map:
- HashMap
- LinkedHashMap
- TreeMap
В чём отличие ArrayList от LinkedList?
- ArrayList: динамический массив, быстрый доступ по индексу О(1), но медленное добавление и удаление элементов в середину или в начало списка т.к. необходимо каждый раз сдвигать элементы.
- LinkedList: двусвязный список, быстрое добавление и удаление элементов в любом месте списка, но медленный доступ по индексу т.к. необходимо каждый раз перебирать все элементы. Используют, если элементы чаще добавляются, чем читаются.
В чём отличие HashSet от TreeSet?
- HashSet: основана на хеш-таблице, неупорядочена (порядок зависит от хеш-кода), операции вставки, удаления и поиска выполняются в среднем за константное время O(1). Производительность может снижаться из-за коллизий. Хранит значения как ключи в HashMap.
- TreeSet: основана на красно-черном дереве, хранит элементы в отсортированном виде по Natural Order или Comparator, медленнее в плане операций добавления, удаления и поиска O(log n).
В чём отличие Set от Map?
- Set: не упорядочена, хранит только уникальные элементы и не поддерживает доступ по индексу.
- Map: хранит пары “ключ-значение”, где ключи уникальны, но значения могут повторяться, и доступ осуществляется по ключу. Нет итератора.
Как задается порядок следования объектов в коллекции, как отсортировать коллекцию?
Для сортировки коллекций используются два основных подхода:
- Естественный порядок (Natural order): Класс должен реализовывать интерфейс Comparable и переопределить метод compareTo(). Сортировка выполняется с помощью: Collections.sort(list) или list.sort(null); или list.sort(Comparator.naturalOrder());.
- Сортировка по пользовательскому порядку: Если нужно отсортировать коллекцию в нестандартном порядке, необходимо создать свой компаратор, реализующий интерфейс Comparator, с методом compare(). Сортировка выполняется с помощью: Collections.sort(list, comparator) или list.sort(comparator);.
Важно! Для сортировки коллекций Set или Map сначала необходимо их преобразовать в List, а затем применить сортировку.
Чем отличается Comparable от Comparator?
- Comparable - используется для задания естественного порядка объектов, реализуя метод compareTo() внутри класса, поэтому может быть реализован только один раз для одного класса.
- Comparator - позволяет задать порядок вне класса, реализуя метод compare() в отдельном классе, поэтому можно создавать сколько угодно разных компараторов для одного класса.
Что такое сортировка по принципу Natural Order?
Natural Order — это естественный порядок сортировки элементов, основанный на их типе.
Например, для чисел — по возрастанию, для строк — лексикографически.
Что такое equals и hashcode?
- equals() - метод для проверки двух объектов на равенство.
- hashCode() - метод для вычисления хэш-кода объекта. Необходим для работы с хэш-структурами, такими как HashMap, HashSet.
Запомнить правило:
- Если два объекта равны по equals(), их hashСode() должен быть одинаковым.
- Если у двух объектов одинаковый hashСode() , то они не обязательно равны по equals(), т.к. возможны коллизии, когда разные объекты имеют одинаковый хеш-код.
Какие есть способы перебора всех элементов List?
- Циклы: for, for-each, while.
- Итераторы: Iterator, ListIterator.
- Потоки Stream API.
- Метод forEach() (Java 8+)
Расскажите о методах Map.
- V put(K key, V value) - добавляет пару ключ-значение или обновляет существующее.
- V get(K key) - возвращает значение по ключу.
- keySet() - возвращает коллекцию Set, состоящую из ключей.
- entrySet() - возвращает коллекцию Set, состоящую из объектов Map.Entry, которые содержат ключ и значение.
- values() - возвращает коллекцию Collection, состоящую из значений.
- getKey() - относится к элементу Map.Entry, возвращает ключ.
- getValue() - относится к элементу Map.Entry, возвращает значение.
- remove(key) - удаляет пару по ключу.