Экзамен Коллекции | Блок 4 Flashcards

1
Q

Как реализован цикл foreach?

A

Цикл for each является синтаксическим сахаром и используется только для классов, реализующих интерфейс Iterable. Внутри используется механизм Итератора с его методами hasNext(), next().

Все коллекции реализуют шаблон проектирования - итератор. Этот шаблон позволяет получить все элементы из любой коллекции.

Шаблон итератор основан на интерфейсе java.util.Iterable.
Он имеет три основных метода:

boolean hasNext() - проверяет на наличие следующего элемента в списке.
T next() - возвращает элемент из коллекции и переводит указатель на следующий элемент.
void remove() - удаляет элемент из коллекции и переводит указатель назад.

Указатель - это механизм позволяющий извлечь одиночный элемент из коллекции. Например для массива указатель будет индекс элемента.

Сам цикл for-each внутри использует механизм итератора.

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

В чем разница между Iterator и Iterable?

A

interface Iterable находится в пакете java.lang и имплементация этого интерфейса позволяет объекту быть итерируемым с помощью for-each. Из под реализации Iterable можно вызвать iterator. И не один. И даже в нескольких потоках. А может и не использовать итератор вовсе.

interface Iterator находится в пакете java.util. В его имплементации задаются правила обхода коллекции.

Да и названия интерфейсов говорят сами за себя:

Iterable (какое) - итерируемое. То по чему можно итерироваться. Имплементируется классом, по которому нужно будет итерироваться.

Iterator (кто/что) - инструмент итерирования по коллекции. Итератор это отдельный класс, как правило вложенный в итерируемый класс, который задает логику итерации по итерируемому. И, естественно, имплементирует интерфейс Iterator.

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

Как происходит удаление элементов из ArrayList?

A

remove() - Удаляет элемент по индексу или по значению.

removeAll(Collection<?> c) - удаляет все элементы, содержащиеся в переданной коллекции.

removeIf(Predicate<? super E> filter) - удаляет все элементы, удовлетворяющие переданному условию

removeRange(int fromIndex, int toIndex) - удаляет элементы, входящие в переданный диапазон индексов

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

Как происходит удаление элементов из LinkedList?

A

poll(), pollFirst(), remove() , removeFirst(), pop() - Возвращает и удаляет первый элемент списка, возвращает null, если список пуст

pollLast(), removeLast() - Возвращает и удаляет последний элемент списка, возвращает null, если список пуст

removeFirstOccurrence(Object o) - удаляет первое вхождение элемента

removeLastOccurrence(Object o) - удаляет последнее вхождение элемента

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

Что такое автоупаковка и распаковка? Зачем они нужны?

A

Это процесс автоматического преобразования примитивных типов данных в соответствующие классы-обертки, и наоборот, в процессе компиляции или выполнения программы.

В Java примитивные типы данных, такие как int, char, float и другие, не являются объектами, и поэтому не могут использовать методы и свойства объектов. Однако в некоторых случаях требуется использовать объекты, например, когда нужно сохранить значение примитивного типа в коллекцию или передать его в метод, который принимает только объекты.

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

В каком случае при работе с упакованными значениями может возникнуть проблема с производительностью?

A

Например, при арифметических операциях над значениями классов-оберток в цикле.

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

Опишите недостатки и преимущества в использовании примитивных типов и классов-оберток.

A

Примитивные типы занимают меньше места в памяти, не требуют затрат на автораспаковку/упаковку, но не могут быть использованы для параметризации генериков и входить в состав коллекций.

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