Экзамен Коллекции | Блок 4 Flashcards
Как реализован цикл foreach?
Цикл for each является синтаксическим сахаром и используется только для классов, реализующих интерфейс Iterable. Внутри используется механизм Итератора с его методами hasNext(), next().
Все коллекции реализуют шаблон проектирования - итератор. Этот шаблон позволяет получить все элементы из любой коллекции.
Шаблон итератор основан на интерфейсе java.util.Iterable.
Он имеет три основных метода:
boolean hasNext() - проверяет на наличие следующего элемента в списке.
T next() - возвращает элемент из коллекции и переводит указатель на следующий элемент.
void remove() - удаляет элемент из коллекции и переводит указатель назад.
Указатель - это механизм позволяющий извлечь одиночный элемент из коллекции. Например для массива указатель будет индекс элемента.
Сам цикл for-each внутри использует механизм итератора.
В чем разница между Iterator и Iterable?
interface Iterable находится в пакете java.lang и имплементация этого интерфейса позволяет объекту быть итерируемым с помощью for-each. Из под реализации Iterable можно вызвать iterator. И не один. И даже в нескольких потоках. А может и не использовать итератор вовсе.
interface Iterator находится в пакете java.util. В его имплементации задаются правила обхода коллекции.
Да и названия интерфейсов говорят сами за себя:
Iterable (какое) - итерируемое. То по чему можно итерироваться. Имплементируется классом, по которому нужно будет итерироваться.
Iterator (кто/что) - инструмент итерирования по коллекции. Итератор это отдельный класс, как правило вложенный в итерируемый класс, который задает логику итерации по итерируемому. И, естественно, имплементирует интерфейс Iterator.
Как происходит удаление элементов из ArrayList?
remove() - Удаляет элемент по индексу или по значению.
removeAll(Collection<?> c) - удаляет все элементы, содержащиеся в переданной коллекции.
removeIf(Predicate<? super E> filter) - удаляет все элементы, удовлетворяющие переданному условию
removeRange(int fromIndex, int toIndex) - удаляет элементы, входящие в переданный диапазон индексов
Как происходит удаление элементов из LinkedList?
poll(), pollFirst(), remove() , removeFirst(), pop() - Возвращает и удаляет первый элемент списка, возвращает null, если список пуст
pollLast(), removeLast() - Возвращает и удаляет последний элемент списка, возвращает null, если список пуст
removeFirstOccurrence(Object o) - удаляет первое вхождение элемента
removeLastOccurrence(Object o) - удаляет последнее вхождение элемента
Что такое автоупаковка и распаковка? Зачем они нужны?
Это процесс автоматического преобразования примитивных типов данных в соответствующие классы-обертки, и наоборот, в процессе компиляции или выполнения программы.
В Java примитивные типы данных, такие как int, char, float и другие, не являются объектами, и поэтому не могут использовать методы и свойства объектов. Однако в некоторых случаях требуется использовать объекты, например, когда нужно сохранить значение примитивного типа в коллекцию или передать его в метод, который принимает только объекты.
В каком случае при работе с упакованными значениями может возникнуть проблема с производительностью?
Например, при арифметических операциях над значениями классов-оберток в цикле.
Опишите недостатки и преимущества в использовании примитивных типов и классов-оберток.
Примитивные типы занимают меньше места в памяти, не требуют затрат на автораспаковку/упаковку, но не могут быть использованы для параметризации генериков и входить в состав коллекций.