Коллекции.JAVA Flashcards
Что такое «коллекция»?
(4)
«Коллекция» - это структура данных, который содержит набор объектов одного типа.
Данными (объектами в наборе) могут быть числа, строки, объекты пользовательских классов и т.п.
Каждый класс имеет свою специфику хранения объектов.
Классы коллекций являются дженерик-параметрами.
Что такое Java Collections Framework (JCF)?
1) JCF - это набор интерфейсов и реализующих их классов, образующих набор основных используемых коллекций.
2) Хотя это и называется “фреймворк”, JCF скорее является библиотекой.
3) JCF является частью JDK.
Расскажите про иерархию коллекций
Иерархия коллекций в Java - это иерархическая структура классов и интерфейсов, которые предоставляют реализацию различных типов коллекций. Коллекции в Java используются для хранения, обработки и манипулирования группой объектов.
В Java существует два основных пути для иерархии коллекций:
Интерфейсы коллекций:
Collection - основной интерфейс, который описывает базовые методы, необходимые для работы с коллекциями, включая добавление, удаление, поиск и получение элементов. Он расширяет интерфейс Iterable, что позволяет использовать цикл for-each для перебора элементов коллекции.
List - интерфейс, который определяет упорядоченный список элементов, которые могут дублироваться. Он предоставляет дополнительные методы для работы со списками, такие как получение элемента по индексу, вставка элемента в указанную позицию и т.д.
Set - интерфейс, который определяет неупорядоченный набор элементов, которые не могут дублироваться. Он предоставляет методы для проверки наличия элемента в наборе, добавления элемента в набор, удаления элемента из набора и т.д.
Queue - интерфейс, который определяет коллекцию элементов, которые можно добавлять в конец и извлекать из начала. Он расширяет интерфейс Collection и определяет дополнительные методы, такие как offer(), poll() и peek(), которые позволяют добавлять, извлекать и просматривать элементы очереди.
Deque - интерфейс, который определяет двустороннюю очередь, которая позволяет добавлять и извлекать элементы как с головы, так и с хвоста. Он расширяет интерфейс Queue и определяет дополнительные методы, такие как addFirst(), addLast(), removeFirst(), removeLast() и т.д.
Реализации коллекций:
ArrayList - класс, который представляет упорядоченный список элементов, хранящихся в массиве. Он реализует интерфейс List и предоставляет методы для быстрого доступа к элементам по индексу.
LinkedList - класс, который представляет двусвязный список элементов. Он реализует интерфейсы List и Deque и предоставляет быстрое добавление и удаление элемент
Какие данные могут хранить коллекции?
Коллекции могут хранить любые ссылочные типы данных - то есть, ссылки на объекты. Если нужно хранить числа, их придется «оборачивать» в Integer, Double и т.д.
Иерархия Коллекций: главные интерфейсы.
На вершине иерархии в Java Collection Framework располагаются 2 интерфейса: Collection (extends Iterable) и Map. Эти интерфейсы разделяют все коллекции, входящие во фреймворк на две части по типу хранения данных: простые последовательные наборы элементов и наборы пар «ключ — значение» соответственно.
Интерфейс Collection расширяют интерфейсы:
List (список) представляет собой коллекцию, в которой допустимы дублирующие
значения. Элементы такой коллекции пронумерованы, начиная от нуля, к ним можно
обратиться по индексу.
Set (сет) описывает неупорядоченную коллекцию, не содержащую повторяющихся
элементов. Реализации:(
Queue (очередь) предназначена для хранения элементов с предопределенным
способом вставки и извлечения FIFO (first-in-first-out):
Методы Collection
(10)
add(E e) - добавляет элемент в коллекцию;
addAll(Collection<? extends E> c) - добавляет все элементы из указанной коллекции в текущую коллекцию;
remove(Object o) - удаляет элемент из коллекции;
removeAll(Collection<?> c) - удаляет из коллекции все элементы, которые есть в указанной коллекции;
retainAll(Collection<?> c) - удаляет из коллекции все элементы, которых нет в указанной коллекции;
clear() - удаляет все элементы из коллекции;
contains(Object o) - проверяет, содержит ли коллекция указанный элемент;
containsAll(Collection<?> c) - проверяет, содержит ли коллекция все элементы из указанной коллекции;
isEmpty() - проверяет, пуста ли коллекция;
size() - возвращает количество элементов в коллекции;
iterator() - возвращает итератор для обхода элементов в коллекции;
toArray() - возвращает массив, содержащий все элементы коллекции;
toArray(T[] a) - возвращает массив указанного типа, содержащий все элементы коллекции.
Назвать главные реализации List
ArrayList - инкапсулирует в себе обычный массив Oblect, длина которого автоматически увеличивается при добавлении новых элементов. Элементы такой коллекции пронумерованы, начиная от нуля, к ним можно обратиться по индексу.
Какие методы ArrayList добавляет в List?
public void trimToSize()
public void ensureCapacity(int minCap)
LinkedList (implements Deque)
двунаправленный связный список - состоит из узлов, каждый из которых содержит как собственно данные, так и две ссылки на следующий и предыдущий узел.
Vector — реализация динамического массива объектов, методы которой синхронизированы.
Stack — расширяет Vector добавляя LIFO (last-in-first-out).
Какие методы добавляет List в Collection?
(6)
get(int index)
set(int index, element)
indexOf(element)
lastIndexOf(element)
ListIterator<E> listIterator();</E>
List<E> subList(int from, int to);</E>
static <E> List<E> of(E... elms)</E></E>
static <E> List<E> copyOf(Collection<? extends E> coll)</E></E>
add(int index, element)
addAll(int index, Collection c)
remove(int index)
Назвать главные реализации Set
(3)
Может ли Set хранить null?
Какие методы добавляет Set в Collection?
HashSet - использует HashMap для хранения данных: в качестве ключа используется добавляемый элемент. В качестве значения объект-заглушка(константа). Порядок хранения элементов неупорядочен.
LinkedHashSet — гарантирует, что порядок элементов при обходе коллекции будет идентичен порядку добавления элементов.
SortedSet->NavigableSet->TreeSet — предоставляет возможность управлять порядком элементов в коллекции при помощи объекта Comparator, либо сохраняет элементы с использованием «natural ordering».
Не может хранить null.
Какие методы добавляет Set в Collection?
static <E> Set<E> of(E... elms)</E></E> static <E> Set<E> copyOf(Collection<? extends E> coll)</E></E>
Какие доп.методы есть у TreeSet?
public NavigableSet<E> **subSet**(E from, boolean fromIncl, E to, boolean toIncl)</E> public NavigableSet<E> **tailSet**(E fromElement, boolean inclusive)</E> public NavigableSet<E> **headSet**(E toElement, boolean inclusive)</E> first() last()
Назвать главные реализации Queue? (3)
Какие методы добавляет Deque к Queue?(3)
AbstractQueue => PriorityQueue — предоставляет возможность управлять порядком элементов в коллекции при помощи объекта Comparator, либо сохраняет элементы с использованием «natural ordering» (по умолчанию).
Deque => ArrayDeque — реализация интерфейса Deque, который расширяет интерфейс Queue методами, позволяющими реализовать Deque => LinkedList
Deque (двунаправленная очередь) предназначена для хранения и извлечения элементов по принципу FIFO + LIFO.
Какие методы добавляет Deque к Queue?
addFirst()
addLast()
…element->getFirst()
Расположите в виде иерархии следующие интерфейсы:
Iterable
Collection
List
Set
SortedSet
NavigableSet
Map
SortedMap
NavigableMap
Iterator
Почему Map — это не Collection, в то время как List и Set являются Collection?
Collection представляет собой совокупность некоторых элементов. Map - это совокупность пар «ключ-значение».
В чем разница между классами java.util.Collection и java.util.Collections?
Класс java.util.Collection является интерфейсом, который определяет общие методы для всех коллекций в Java, таких как добавление элементов, удаление элементов, проверка наличия элементов и т.д. Он является частью Java Collections Framework и наследуется другими интерфейсами, такими как List, Set и Queue.
Класс java.util.Collections, с другой стороны, является утилитным классом, который предоставляет статические методы для работы с коллекциями. Эти методы позволяют выполнять различные операции над коллекциями, такие как сортировка, перемешивание, копирование, заполнение и т.д. Класс Collections не имеет собственных свойств или методов для работы с коллекциями, он предоставляет только статические методы для работы с объектами коллекций.
Таким образом, разница между классами java.util.Collection и java.util.Collections заключается в том, что первый является интерфейсом, определяющим общие методы для коллекций, а второй - это утилитный класс, предоставляющий статические методы для работы с коллекциями.
Что такое «fail-fast поведение»?
В Java Collections API некоторые итераторы ведут себя как fail-fast и выбрасывают ConcurrentModificationException, если после его создания была произведена модификация коллекции, т.е. добавлен или удален элемент напрямую из коллекции, а не используя методы итератора.
Реализация такого поведения осуществляется за счет подсчета количества модификаций коллекции (modification count):
- при изменении коллекции счетчик модификаций так же изменяется;
- при создании итератора ему передается текущее значение счетчика;
- при каждом обращении к итератору сохраненное значение счетчика сравнивается с текущим, и, если они не совпадают, возникает исключение.
Какая разница между fail-fast и fail-safe?
В противоположность fail-fast, итераторы fail-safe не вызывают никаких исключений так как “Fail-safe” итератор в Java - это итератор, который создает копию коллекции и работает с ней, а не с оригинальной коллекцией. Это позволяет безопасно изменять коллекцию во время итерации без возникновения исключений ConcurrentModificationException.
Приведите примеры итераторов реализующих поведение fail-safe
Некоторые коллекции в Java, такие как ConcurrentHashMap, CopyOnWriteArrayList и CopyOnWriteArraySet, используют итераторы, которые реализуют поведение “fail-safe”.
Пример fail-fast - Vector и Hashtable.
Чем различаются Enumeration и Iterator?
(3)
Iterator имеет больше методов работы с коллекциями и был специально введен в java2, вместо Enumeration(interface). Рекоммендуется юзать Iterator.
Оба интерфейса предназначены для обхода коллекции, но есть различия:
* -с помощью Enumeration нельзя добавлять/удалять элементы;
* -в Iterator исправлены имена методов для повышения читаемости кода (Enumeration.hasMoreElements() соответствует Iterator.hasNext(), Enumeration.nextElement() соответствует Iterator.next() и т.д);
* -Enumeration присутствуют в устаревших классах, таких как Vector/Stack, тогда как Iterator есть во всех современных коллекциях.
Как между собой связаны Iterable и Iterator?
Интерфейс Iterable имеет только один метод - iterator(), с типом возвращаемого значения - интерфейс Iterator.
Как между собой связаны Iterable, Iterator и «for-each»?
Классы, реализующие интерфейс Iterable, могут применяться в конструкции for-each, которая использует Iterator.
Можно ли итерируясь по ArrayList удалить элемент? Какое вылетит
исключение?
Можно, но нужно использовать iterator.remove().
Иначе при прохождении по ArrayList в цикле for сразу после удаления элемента будет ConcurrentModificationException.
Как поведёт себя коллекция, если вызвать iterator.remove()?
Этот метод удаляет текущий элемент. Важный момент заключается в том, что сначала этот элемент необходимо получить с помощью метода next(), если мы вызовем метод remove() до метода next(), то мы получим IllegalStateException.
Сравните Iterator и ListIterator.
(5)
- ListIterator расширяет интерфейс Iterator
- ListIterator может быть использован только для перебора элементов коллекции List;
- Iterator позволяет перебирать элементы только в одном направлении, при помощи метода next(). Тогда как ListIterator позволяет перебирать список в обоих направлениях, при помощи методов next() и previous();
- ListIterator не указывает на конкретный элемент: его текущая позиция располагается между элементами, которые возвращают методы previous() и next().
- При помощи ListIterator вы можете модифицировать список, добавляя/удаляя элементы с помощью методов add() и remove(). Iterator не поддерживает данного функционала.
Как избежать ConcurrentModificationException во время перебора коллекции?
- Попробовать подобрать другой итератор, работающий по принципу fail-safe. К примеру, для List можно использовать ListIterator.
- Использовать ConcurrentHashMap и CopyOnWriteArrayList.
- Преобразовать список в массив и перебирать массив.
- Блокировать изменения списка на время перебора с помощью блока synchronized.
Отрицательная сторона последних двух вариантов - ухудшение производительности.
Чем Set отличается от List? (5)
1) List хранит объекты к порядке вставки
2) В List элемент можно получить по индексу
3) Set не может хранить одинаковых элементов
4) Метод add() добавляет элемент в коллекцию и возвращает true, если не было такого элемента.
5) Разрешено наличие только одной ссылки типа null
Расскажите про интерфейс Set.(5)
Интерфейс Set расширяет интерфейс Collection.
Set не добавляет новых методов, только вносит изменения унаследованные.
Set - неупорядоченный набор неповторяющихся элементов
В частности, метод add() добавляет элемент в коллекцию и возвращает true, если не было такого элемента.
Разрешено наличие только одной ссылки типа null.
Расскажите про реализации интерфейса Set
В HashSet порядок добавления элементов будет непредсказуемым - используется хэширование для ускорения выборки.
LinkedHashSet хранит элементы в порядке добавления.
SortedSet интерфейс
По умолчанию сортировка производится привычным способом, но можно изменить это поведение через интерфейс Comparable.
В TreeSet объекты хранятся отсортированными по возрастанию из-за применения к/ч дерева.