Streams & Collections Flashcards
(14 cards)
Что такое Stream в Java и какие его ключевые свойства?
Stream — это инструмент для обработки последовательностей данных через цепочку операций:
Без изменения коллекции (иммутабельность)
С ленивым выполнением операций
Поддерживает генерацию, итерацию, строитель (builder)
Позволяет работать с массивами, коллекциями и даже бесконечными потоками
Какие бывают операции в Stream и что они делают?
🔹 Промежуточные (ленивые):
filter, map, sorted, distinct, limit, peek
🔸 Терминальные (активируют выполнение):
forEach, collect, count, reduce, anyMatch, allMatch
Почему стоит использовать Stream API?
✅ Чистый и читаемый код
✅ Не изменяет исходные коллекции
✅ Позволяет распараллелить обработку с .parallel() (используется ForkJoinPool)
✅ Поддерживает бесконечные потоки (generate, iterate)
✅ Упрощает сложные трансформации и агрегации без вложенных циклов
Что такое Iterator в Java?
Интерфейс, позволяющий поэлементно обходить коллекции с помощью методов hasNext(), next() и (опционально) remove().
Где используется итератор?
Для обхода коллекций без индексов (Set, Map.values())
Для безопасного удаления элементов при обходе
При реализации собственных структур данных
Какое внутреннее строение ArrayList?
ArrayList — это реализация интерфейса List, основанная на обычном массиве объектов (Object[]), в котором элементы хранятся последовательно в памяти.
Когда массив заполняется, ArrayList создаёт новый, больший массив (обычно в 1.5 раза больше), и копирует в него все элементы. Эта операция дорогая по ресурсам.
🔧 Из-за такой структуры:
Быстрый доступ по индексу (get(index)) — O(1), потому что элементы хранятся рядом
Быстрое добавление в конец — O(1) (амортизированно), если есть место
Медленная вставка/удаление в середине или начале — O(n), т.к. все последующие элементы нужно сдвигать
Какое внутреннее строение LinkedList?
LinkedList — это реализация интерфейса List, основанная на двусвязном списке узлов (Node), а не на массиве.
Каждый элемент списка представлен объектом Node, который содержит:
значение (item)
ссылку на следующий узел (next)
ссылку на предыдущий узел (prev)
LinkedList состоит из узлов Node, связанных между собой через prev и next.
➤ Вставка и удаление — быстрые (O(1), просто перенастройка ссылок)
➤ Доступ по индексу — медленный (O(n), нужен линейный проход)
➤ Каждый элемент хранит две ссылки → больше памяти
В чём разница между ArrayList и LinkedList?
ArrayList хранит данные в массиве → быстрый доступ по индексу (O(1))
LinkedList хранит данные в узлах с ссылками → быстрая вставка/удаление в начале (O(1)), но медленный доступ по индексу (O(n))
Когда лучше использовать ArrayList, а когда LinkedList?
ArrayList → если часто читаем по индексу
LinkedList → если часто добавляем/удаляем элементы в начале или середине списка
Чем отличается ArrayList от HashSet?
ArrayList хранит элементы по порядку, допускает дубликаты и поддерживает доступ по индексу.
HashSet не гарантирует порядок, не допускает дубликаты и работает быстрее при поиске.
Когда использовать HashSet вместо ArrayList?
Когда нужны только уникальные элементы и важна скорость операций добавления и поиска.
Как отсортировать коллекцию элементов?
🔹 Collections.sort(list)
Используется для списков, если элементы реализуют Comparable<T> (естественный порядок, например, по алфавиту).</T>
🔹 list.sort(comparator)
Современный и читаемый способ (Java 8+), принимает Comparator (удобен для разных критериев сортировки).
🔹 stream.sorted()
Сортирует поток, не изменяя оригинальную коллекцию. Удобно при фильтрации и трансформации.
Comparator можно задать как:
🔸 Анонимный класс
🔸 Лямбда: (a, b) -> a.getAge() - b.getAge()
🔸 Метод: Comparator.comparing(Student::getAge)
💡 Используйте Comparable, если у объекта есть естественный порядок.
Если нужна гибкость — применяйте Comparator.
В чём разница между Comparable и Comparator в Java?
Comparable<T> используется для естественной сортировки (например, алфавит по имени).
🔹 Требует реализации интерфейса в классе: implements Comparable<Student>
🔹 Метод compareTo() должен быть переопределён.</Student></T>
Comparator<T> применяется для кастомной сортировки (по возрасту, длине строки и т.д.).
🔹 Не требует изменений в классе.
🔹 Можно использовать с Collections.sort(), List.sort(), Stream.sorted().
🔹 Удобно применять через лямбда или анонимный класс.</T>
Какая реализация интерфейса Map позволяет сохранить порядок добавления элементов?
LinkedHashMap — сохраняет порядок добавления.
TreeMap — сортирует по ключу.
HashMap — не гарантирует порядок.