Коллекции.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