Streams & Collections Flashcards

(14 cards)

1
Q

Что такое Stream в Java и какие его ключевые свойства?

A

Stream — это инструмент для обработки последовательностей данных через цепочку операций:

Без изменения коллекции (иммутабельность)

С ленивым выполнением операций

Поддерживает генерацию, итерацию, строитель (builder)

Позволяет работать с массивами, коллекциями и даже бесконечными потоками

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Какие бывают операции в Stream и что они делают?

A

🔹 Промежуточные (ленивые):
filter, map, sorted, distinct, limit, peek
🔸 Терминальные (активируют выполнение):
forEach, collect, count, reduce, anyMatch, allMatch

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Почему стоит использовать Stream API?

A

✅ Чистый и читаемый код
✅ Не изменяет исходные коллекции
✅ Позволяет распараллелить обработку с .parallel() (используется ForkJoinPool)
✅ Поддерживает бесконечные потоки (generate, iterate)
✅ Упрощает сложные трансформации и агрегации без вложенных циклов

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Что такое Iterator в Java?

A

Интерфейс, позволяющий поэлементно обходить коллекции с помощью методов hasNext(), next() и (опционально) remove().

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Где используется итератор?

A

Для обхода коллекций без индексов (Set, Map.values())

Для безопасного удаления элементов при обходе

При реализации собственных структур данных

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Какое внутреннее строение ArrayList?

A

ArrayList — это реализация интерфейса List, основанная на обычном массиве объектов (Object[]), в котором элементы хранятся последовательно в памяти.
Когда массив заполняется, ArrayList создаёт новый, больший массив (обычно в 1.5 раза больше), и копирует в него все элементы. Эта операция дорогая по ресурсам.

🔧 Из-за такой структуры:

Быстрый доступ по индексу (get(index)) — O(1), потому что элементы хранятся рядом

Быстрое добавление в конец — O(1) (амортизированно), если есть место

Медленная вставка/удаление в середине или начале — O(n), т.к. все последующие элементы нужно сдвигать

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Какое внутреннее строение LinkedList?

A

LinkedList — это реализация интерфейса List, основанная на двусвязном списке узлов (Node), а не на массиве.
Каждый элемент списка представлен объектом Node, который содержит:

значение (item)
ссылку на следующий узел (next)
ссылку на предыдущий узел (prev)

LinkedList состоит из узлов Node, связанных между собой через prev и next.
➤ Вставка и удаление — быстрые (O(1), просто перенастройка ссылок)
➤ Доступ по индексу — медленный (O(n), нужен линейный проход)
➤ Каждый элемент хранит две ссылки → больше памяти

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

В чём разница между ArrayList и LinkedList?

A

ArrayList хранит данные в массиве → быстрый доступ по индексу (O(1))

LinkedList хранит данные в узлах с ссылками → быстрая вставка/удаление в начале (O(1)), но медленный доступ по индексу (O(n))

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Когда лучше использовать ArrayList, а когда LinkedList?

A

ArrayList → если часто читаем по индексу

LinkedList → если часто добавляем/удаляем элементы в начале или середине списка

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Чем отличается ArrayList от HashSet?

A

ArrayList хранит элементы по порядку, допускает дубликаты и поддерживает доступ по индексу.
HashSet не гарантирует порядок, не допускает дубликаты и работает быстрее при поиске.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Когда использовать HashSet вместо ArrayList?

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Как отсортировать коллекцию элементов?

A

🔹 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.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

В чём разница между Comparable и Comparator в Java?

A

Comparable<T> используется для естественной сортировки (например, алфавит по имени).
🔹 Требует реализации интерфейса в классе: implements Comparable<Student>
🔹 Метод compareTo() должен быть переопределён.</Student></T>

Comparator<T> применяется для кастомной сортировки (по возрасту, длине строки и т.д.).
🔹 Не требует изменений в классе.
🔹 Можно использовать с Collections.sort(), List.sort(), Stream.sorted().
🔹 Удобно применять через лямбда или анонимный класс.</T>

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Какая реализация интерфейса Map позволяет сохранить порядок добавления элементов?

A

LinkedHashMap — сохраняет порядок добавления.

TreeMap — сортирует по ключу.

HashMap — не гарантирует порядок.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly