Коллекции Flashcards

1
Q
  1. Что такое «коллекция»?
A

«Коллекция» - это структура данных, набор каких-либо объектов. Данными (объектами в наборе) могут быть числа, строки, объекты пользовательских классов и т.п.

коллекция — это сбор чего-то, контейнер для каких-то элементов.

MЫ ХОТИМ:

  • add
  • remove
  • clear
  • contains
  • size
  • iterator
  • tyoArray
  • isEmpty
  • equals, hashcode

С ДВУМЯ КОЛЛЕКЦИЯМИ:

  • addAll все из одной в другую
  • containsAll содержит все из другой
  • removeAll все из другой
  • retainAll оставить только общие

Соответственно, для описание такого общего поведения для всех коллекций написали разработчики Java интерфейс java.util.Collection.

Массивы решают проблему с хранением нескольких значений в одном месте. Но накладывает ограничение: размер массива постоянен. Если, как в примере, мы сказали что размер = 2, значит он равен двум. И всё. Если мы хотим массив больше — нам нужно создать новый экземпляр.

Кроме того, поиск элемента — тоже сложная вещь для массива. Есть метод Arrays.binarySearch, но данный поиск работает только на сортированном массиве (для несортированного массива результат неопределён или попросту непредсказуем). То есть поиск нас будет обязывать каждый раз сортировать.

Удаление — тоже лишь очищает значение. Поэтому мы ещё и не знаем, сколько в массиве реально данных, знаем только сколько ячеек в массиве.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q
  1. Расскажите про иерархию коллекций
A

Collection:

  1. Set -> SortedSet
  2. List
  3. Queue
  4. Deque

Map -> SortedMap

https: //i0.wp.com/dumbitdude.com/wp-content/uploads/2017/06/hieararchy-for-java-collection-framework.jpg?resize=1000%2C631
https: //habr.com/ru/post/237043/

На вершине иерархии в Java Collection Framework располагаются 2 интерфейса: Collection и Map. Эти интерфейсы разделяют все коллекции, входящие во фреймворк на две части по типу хранения данных: простые последовательные наборы элементов и наборы пар «ключ — значение» соответственно.
Интерфейс Collection расширяют интерфейсы:
● List (список) представляет собой коллекцию, в которой допустимы
дублирующие значения. Элементы такой коллекции пронумерованы, начиная от нуля, к ним можно обратиться по индексу. Реализации:
-ArrayList - инкапсулирует в себе обычный массив, длина которого автоматически увеличивается при добавлении новых элементов.
-LinkedList (двунаправленный связный список) - состоит из узлов, каждый из которых содержит как собственно данные, так и две ссылки на следующий и предыдущий узел.
-Vector — реализация динамического массива объектов, методы которой синхронизированы.
-Stack — реализация стека LIFO (last-in-first-out).
● Set (сет) описывает неупорядоченную коллекцию, не содержащую повторяющихся элементов. Реализации:
-HashSet - использует HashMap для хранения данных. В качестве ключа и значения используется добавляемый элемент. Из-за особенностей реализации порядок элементов не гарантируется при добавлении.
-LinkedHashSet — гарантирует, что порядок элементов при обходе коллекции будет идентичен порядку добавления элементов.
-TreeSet — предоставляет возможность управлять порядком элементов в коллекции при помощи объекта Comparator, либо сохраняет элементы с использованием «natural ordering».
● Queue (очередь) предназначена для хранения элементов с предопределенным способом вставки и извлечения FIFO (first-in-first-out): -PriorityQueue — предоставляет возможность управлять порядком
элементов в коллекции при помощи объекта Comparator, либо сохраняет элементы с использованием «natural ordering».
-ArrayDeque — реализация интерфейса Deque, который расширяет интерфейс Queue методами, позволяющими реализовать конструкцию вида LIFO (last-in-first-out).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q
  1. Почему Map — это не Collection, в то время как List и Set являются Collection?
A

Collection представляет собой совокупность некоторых элементов. Map - это совокупность пар «ключ-значение».

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q
  1. В чем разница между классами java.util.Collection и java.util.Collections?
A

Класс java.util.Collections содержит исключительно статические методы для работы с коллекциями. В них входят методы, реализующие полиморфные алгоритмы (такие алгоритмы, использование которых возможно с разными видами структур данных), “оболочки”, возвращающие новую коллекцию с инкапсулированной указанной структурой данных и некоторые другие методы.

java.util.Collection - это корневой интерфейс Java Collections Framework. Этот интерфейс в основном применяется там, где требуется высокий уровень абстракции, например, в классе java.util.Collections.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q
  1. Какая разница между итераторами с fail-fast и fail-safe поведением? (С
    примерами)
A

Fail-fast итератор генерирует исключение ConcurrentModificationException, если коллекция меняется во время итерации, а fail-safe – нет.
В противоположность fail-fast, итераторы fail-safe не вызывают никаких исключений при изменении структуры, потому что они работают с клоном коллекции вместо оригинала.
Итератор коллекции CopyOnWriteArrayList и итератор представления keySet коллекции ConcurrentHashMap являются примерами итераторов fail-safe.

fail-fast Iterator
Итераторы в Java используются для итерации по объектам Collection. Fail-Fast итераторы немедленно вызывают ConcurrentModificationException, если есть структурная модификация коллекции. Структурная модификация означает добавление, удаление или обновление любого элемента из коллекции, когда поток выполняет итерацию по этой коллекции. Iterator в классах ArrayList, HashMap - это примеры fail-fast Iterator.

import java.util.ArrayList;
import java.util.Iterator;

public class FailFastIteratorExample {       
    public static void main(String[] args) {
        // Создание ArrayList целых чисел
        ArrayList list = new ArrayList();
    // Добавление элементов в список

    list. add(1452);
    list. add(6854);
    list. add(8741);
        // Получение итератора из списка
        Iterator it = list.iterator();
        while (it.hasNext()) {
            Integer integer = (Integer) it.next();
            // Это вызовет исключение 
            // ConcurrentModificationException
            list.add(8457);      
        }
    }   
}
Вывод:

Exception in thread “main” java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
at java.util.ArrayList$Itr.next(Unknown Source)
at pack1.MainClass.main(MainClass.java:32)
fail-safe Iterator
fail-safe итераторы не генерируют никаких исключений, если коллекция структурно изменена во время итерации по ней. Это связано с тем, что они работают с клоном коллекции, а не с исходной коллекцией, и поэтому их называют fail-safe итераторами. Итератор в классах CopyOnWriteArrayList, ConcurrentHashMap являются примерами fail-safe итератора.

import java.util.Iterator;
import java.util.concurrent.ConcurrentHashMap;

public class FailSafeIteratorExample {       
    public static void main(String[] args) {
        // Создание ConcurrentHashMap
        ConcurrentHashMap map = 
            new ConcurrentHashMap();
    // Добавляем элементы на карту

    map. put("ONE", 1);
    map. put("TWO", 2);
    map. put("THREE", 3);
        // Получение итератора из карты
        Iterator it = map.keySet().iterator();
        while (it.hasNext()) {
            String key = (String) it.next();
            System.out.println(key+" : "+map.get(key));
            // Это не будет отражено в Iterator
            map.put("FOUR", 4);
        }
    }   
}
Вывод:

TWO : 2
FOUR : 4
ONE : 1
THREE : 3

https://javarush.ru/groups/posts/399-skaz-o-dvukh-iteratorakh-strategii-konkurentnoy-modifikacii-v-java-

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q
  1. Чем различаются Enumeration и Iterator?
A

Интерфейс Enumeration – определяет методы, с помощью которых вы можете перечислить (получить по одному) элементы в коллекции объектов.
Этот устаревший интерфейс был заменён Iterator
- с помощью Enumeration нельзя добавлять/удалять элементы;
- в Iterator исправлены имена методов для повышения читаемости кода (Enumeration.hasMoreElements() соответствует Iterator.hasNext(), Enumeration.nextElement() соответствует Iterator.next() и т.д);
- Enumeration присутствуют в устаревших классах, таких как Vector/Stack, тогда как Iterator есть во всех современных классах-коллекциях.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q
  1. Как между собой связаныIterable,Iteratorи «for-each»?
A

Классы, реализующие интерфейсIterable, могут применяться в конструкцииfor-each, которая используетIterator.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q
  1. Можно ли итерируясь по ArrayList удалить элемент? Какое вылетит
    исключение?
A

Подвох в том, что итератор ArrayList, является fail-fast, то есть не поддерживает итерацию с параллельной модификацией. Следующий шаг итератора после удаления элемента выбросит ConcurrentModificationException.
Единственный способ удалить элемент из коллекции при обходе, не получив при этом ConcurrentModificationException или неопределенное поведение – удалить с помощью remove() того же инстанса итератора. Вариант ListIterator поможет, если в теле цикла требуется и работа с индексами.

Некоторые коллекции, такие как CopyOnWriteArrayList и ConcurrentHashMap адаптированные под многопоточную среду и имеют fail-safe итераторы.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q
  1. Как поведёт себя коллекция, если вызвать iterator.remove()
A

Если вызову iterator.remove() предшествовал вызов iterator.next(), то iterator.remove() удалит элемент коллекции, на который указывает итератор, в противном случае будет выброшено IllegalStateException().

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q
  1. Чем Set отличается от List?
A

Первое различие состоит в том, что один и тот же элемент не может встречаться в наборе более одного раза. Это отличается от списка, где каждый элемент может встречаться более одного раза.
Второе отличие состоит в том, что элементы в Set не имеют гарантированного внутреннего порядка. Элементы в списке имеют внутренний порядок, и элементы могут быть повторены в этом порядке.
Источник: https://java-blog.ru/collections/interfeys-java-set

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q
  1. Расскажите про интерфейс Set.
A

Set — интерфейс, описывающий такую структуру данных как множество, содержащее неупорядоченные уникальные (неповторяющиеся) элементы. У интерфейса есть стандартные реализации — TreeSet, HashSet и LinkedHashSet.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q
  1. Расскажите про реализации интерфейса Set
A

Set - набор/множество, не может содержать дубликаты.

HashSet - основан на HashMap.

LinkedHashSet - расширяет HashSet, позволяет получать элементы в порядке их добавления, но требует больше памяти.

TreeSet - основан на сбалансированном двоичном дереве, в результате элементы упорядочены по возрастанию hashCode()’ов. Можно управлять порядком при помощи компаратора.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q
  1. В чем отличия TreeSet и HashSet?
A

TreeSet обеспечивает упорядоченно хранение элементов в виде красно-черного дерева. Сложность выполнения основных операций в TreeSet lg N. HashSet использует для хранения элементов такой же подход, что и HashMap, за тем отличием, что в HashSet в качестве ключа выступает сам элемент, кроме того HashSet (как и HashMap) не поддерживает упорядоченное хранение элементов и обеспечивает временную сложность выполнения операций аналогично HashMap.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q
  1. Чем LinkedHashSet отличается от HashSet?
A

Основное различие в том, что LinkedHashSet сохраняет порядок вставки элементов, а HashSet - нет. При этом LinkedHashSet также как и HashSet использует хэш таблицу, в отличие от того же TreeSet.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q
  1. Что будет, если добавлять элементы в TreeSet по возрастанию?
A

в основе TreeSet лежит красно-черное дерево, которое умеет само себя балансировать. В итоге, TreeSet все равно в каком порядке вы добавляете в него элементы, преимущества этой структуры данных будут сохраняться.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q
  1. Как устроен HashSet, сложность основных операций.
A

HashSet основан на Map. Тк он наследует Set, то без дубликатов.
Ключи - это значения Set, значения = константы заглушки
В лучшем случае О(1)
В худшем случае О(N)
Коэффициент загрузки = Количество хранимых элементов в таблице / размер хэш-таблицы
при достижении 0,75 количество корзин удваивается.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
17
Q
  1. Как устроен LinkedHashSet, сложность основных операций.
A

Implements Set interface, extends HashSet classs
Not Synchronized
Initial capacity 16, loadfactor 0,75

LinkedHashSet — подобная HashSet, в которой элементы объединены между собой в порядковый список. В этом случае элементы хранятся в том же порядке, в котором и добавляются (благодаря содержанию в себе объекта LinkedHashMap). И итерируются в том же порядке

Временная сложность основного метода O (1). Если нет коллизий как HashMap

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
18
Q
  1. Как устроен TreeSet, сложность основных операций.
A

TreeSet является одной из наиболее важных реализаций интерфейса SortedSet в Java, который использует дерево для хранения. Порядок элементов поддерживается набором с использованием их естественного порядка, независимо от того, предоставляется ли явный компаратор.

Коллекция, которая хранит свои элементы в виде упорядоченного по значениям дерева. TreeSet инкапсулирует в себе TreeMap, который в свою очередь использует сбалансированное бинарное красно-черное дерево для хранения элементов. TreeSet хорош тем, что для операций add, remove и contains потребуется гарантированное время log(n).

  1. TreeSet реализует интерфейс SortedSet, поэтому повторяющиеся значения не допускаются.
  2. Объекты в TreeSet хранятся в отсортированном и возрастающем порядке.
    TreeSet не сохраняет порядок вставки элементов, но элементы сортируются по ключам.
  3. TreeSet не позволяет вставлять гетерогенные объекты. Он выдаст исключение classCastException во время выполнения, если попытается добавить гетерогенные объекты.
  4. TreeSet служит отличным выбором для хранения больших объемов отсортированной информации, к которой предполагается быстрый доступ из-за более быстрого доступа и времени поиска.
  5. TreeSet — это, по сути, реализация самобалансирующегося бинарного дерева поиска, такого как Red-Black Tree . Поэтому такие операции, как добавление, удаление и поиск, занимают O (Log n) время А такие операции, как печать n элементов в отсортированном порядке, занимают O (n) времени.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
19
Q
  1. Расскажите про интерфейс List
A

Интерфейс List , описывает методы работы с упорядоченными коллекциями. Иногда их называют последовательностями (sequence ). Элементы такой коллекции пронумерованы, начиная от нуля, к ним можно обратиться по индексу. В отличие от коллекции Set элементы коллекции List могут повторяться.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
20
Q
  1. Как устроен ArrayList, сложность основных операций.
A

ArrayList это список, реализованный на основе динамического массива.

● доступ к произвольному элементу по индексу за константное время O(1);
● доступ к элементам по значению за линейное время O(N);
● вставка в конец в среднем производится за константное время O(1);
● удаление произвольного элемента из списка занимает значительное время
т.к. при этом все элементы находящиеся «правее» смещаются на одну
ячейку влево (реальный размер массива (capacity) не изменяется);
● вставка элемента в произвольное место списка занимает значительное
время т.к. при этом все элементы находящиеся «правее» смещаются на
одну ячейку вправо;
● минимум накладных расходов при хранении.

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

Weakly consistent iterator

A

Коллекции weakly consistent iterators:, которые полагаются на CAS( compare-and-swap), имеют слабо согласованные итераторы, которые отражают некоторые, но не обязательно все изменения, внесенные в их резервную коллекцию с момента их создания. Например, если элементы в коллекции были изменены или удалены до того, как итератор достигнет их, он определенно отразит эти изменения, но для вставок такая гарантия не предоставляется.
ConcurrentHashMap

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

Назовите преимущества использования коллекций

A

Массивы обладают значительными недостатками. Одним из них является конечный размер массива, как следствие, необходимость следить за размером массива. Другим — индексная адресация, что не всегда удобно, т.к. ограничивает возможности добавления и удаления объектов.Чтобы избавиться от этих недостатков уже несколько десятилетий программисты используютрекурсивные типы данных, такие какспискиидеревья. Стандартный набор коллекций Java служит для избавления программиста от необходимости самостоятельно реализовывать эти типы данных и снабжает его дополнительными возможностями.

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

Кто кого расширяет: Queue расширяет Deque, или Deque расширяет Queue?

A

Queue - это очередь, которая обычно (но необязательно) строится по принципу FIFO (First-In-First-Out) - соответственно извлечение элемента осуществляется с начала очереди, вставка элемента - в конец очереди. Хотя этот принцип нарушает, к примеру, PriorityQueue, использующая «natural ordering» или переданный Comparator при вставке нового элемента.

Deque (Double Ended Queue) расширяет Queue и согласно документации, это линейная коллекция, поддерживающая вставку/извлечение элементов с обоих концов. Помимо этого, реализации интерфейса Deque могут строится по принципу FIFO, либо LIFO.

Реализации и Deque, и Queue обычно не переопределяют методы equals() и hashCode(), вместо этого используются унаследованные методы класса Object, основанные на сравнении ссылок.

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

Оцените количество памяти на хранение одного примитива типаbyteвLinkedList?

A

Каждый элементLinkedListхранит ссылку на предыдущий элемент, следующий элемент и ссылку на данные.

private static class Node { E item; Node next; Node prev; //… }

Для 32-битных систем каждая ссылка занимает 32 бита (4 байта). Сам объект (заголовок) вложенного классаNodeзанимает 8 байт. 4 + 4 + 4 + 8 = 20 байт, а т.к. размер каждого объекта в Java кратен 8, соответственно получаем 24 байта. Примитив типаbyteзанимает 1 байт памяти, но в JCF примитивы упаковываются: объект типаByteзанимает в памяти 16 байт (8 байт на заголовок объекта, 1 байт на поле типаbyteи 7 байт для кратности 8). Также напомню, что значения от -128 до 127 кэшируются и для них новые объекты каждый раз не создаются. Таким образом, в x32 JVM 24 байта тратятся на хранение одного элемента в списке и 16 байт - на хранение упакованного объекта типаByte. Итого 40 байт.

Для 64-битной JVM каждая ссылка занимает 64 бита (8 байт), размер заголовка каждого объекта составляет 16 байт (два машинных слова). Вычисления аналогичны: 8 + 8 + 8 + 16 = 40байт и 24 байта. Итого 64 байта

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

Назовите основные интерфейсы JCF и их реализации.

A

На вершине иерархии в Java Collection Framework располагаются 2 интерфейса: Collection и Map. Эти интерфейсы разделяют все коллекции, входящие во фреймворк на две части по типу хранения данных: простые последовательные наборы элементов и наборы пар «ключ — значение» соответственно.
Интерфейс Collection расширяют интерфейсы:
● List (список) представляет собой коллекцию, в которой допустимы
дублирующие значения. Элементы такой коллекции пронумерованы, начиная от нуля, к ним можно обратиться по индексу. Реализации:
-ArrayList - инкапсулирует в себе обычный массив, длина которого автоматически увеличивается при добавлении новых элементов.
-LinkedList (двунаправленный связный список) - состоит из узлов, каждый из которых содержит как собственно данные, так и две ссылки на следующий и предыдущий узел.
-Vector — реализация динамического массива объектов, методы которой синхронизированы.
-Stack — реализация стека LIFO (last-in-first-out).
● Set (сет) описывает неупорядоченную коллекцию, не содержащую повторяющихся элементов. Реализации:
-HashSet - использует HashMap для хранения данных. В качестве ключа и значения используется добавляемый элемент. Из-за особенностей реализации порядок элементов не гарантируется при добавлении.
-LinkedHashSet — гарантирует, что порядок элементов при обходе коллекции будет идентичен порядку добавления элементов.
-TreeSet — предоставляет возможность управлять порядком элементов в коллекции при помощи объекта Comparator, либо сохраняет элементы с использованием «natural ordering».
● Queue (очередь) предназначена для хранения элементов с предопределенным способом вставки и извлечения FIFO (first-in-first-out): -PriorityQueue — предоставляет возможность управлять порядком
элементов в коллекции при помощи объекта Comparator, либо сохраняет элементы с использованием «natural ordering».
-ArrayDeque — реализация интерфейса Deque, который расширяет интерфейс Queue методами, позволяющими реализовать конструкцию вида LIFO (last-in-first-out).

26
Q

Расположите в виде иерархии следующие интерфейсы: List, Set, Map, SortedSet, SortedMap, Collection, Iterable, Iterator, NavigableSet, NavigableMap.

A

Iterable Collection
List
Set
SortedSet NavigableSet Map SortedMap NavigableMap Iterator

27
Q

Concurrent Modification

A

Изменение объекта одновременно с выполнением задачи по его обработке.
Например итерация и одновременная попытка изменения

28
Q

Stack считается «устаревшим». Чем его рекомендуют заменять? Почему?

A

Stack был добавлен в Java 1.0 как реализация стека LIFO (last-in-first-out) и является расширением коллекции Vector, хотя это несколько нарушает понятие стека (например, класс Vector предоставляет возможность обращаться к любому элементу по индексу). Является частично синхронизированной коллекцией (кроме метода добавления push()) с вытекающими отсюда последствиями в виде негативного воздействия на производительность. После добавления в Java 1.6 интерфейса Deque, рекомендуется использовать реализации именно этого интерфейса, например ArrayDeque.

29
Q

Статья коллекции

A

http://www.quizful.net/post/Java-Collections

30
Q

Расскажите о ArrayList или LinkedList. Чем они отличаются?

A

ArrayList это список, реализованный на основе массива, а LinkedList — это классический связный список, основанный на объектах с ссылками между ними.

Скорость работы зависит от выполняемых операций над объектом.
Преимущества ArrayList: в возможности доступа к произвольному элементу по индексу за постоянное время (так как это массив), минимум накладных расходов при хранении такого списка, вставка в конец списка в среднем производится так же за постоянное время.
При удалении произвольного элемента из списка, все элементы находящиеся «правее» смещаются на одну ячейку влево, при этом реальный размер массива (его емкость, capacity) не изменяется.
Для эффективного удаления из ArraList нужно выполнить смещение всех элементов, стоящих «правее» n+m позиции на n элементов левее к началу списка. Таким образом, вместо выполнения n итераций перемещения элементов списка, все выполняется за 1 проход.

LinkedList наоборот, за постоянное время может выполнять вставку/удаление элементов в списке. Доступ к произвольному элементу осуществляется за линейное время.
В целом же, LinkedList в абсолютных величинах проигрывает ArrayList и по потребляемой памяти и по скорости выполнения операций. LinkedList предпочтительно применять, когда происходит активная работа (вставка/удаление) с серединой списка или в случаях, когда необходимо гарантированное время добавления элемента в список.

31
Q

Как работает fail-fast iterator

A

Если обнаруживается структурное изменение (добавление, удаление, изменение) во время итерации то выбрасывается ConcurrentModificationException
Примеры: ArrayList, HashMap
Как работает: есть флаг “modCount” , он меняется при каждой модификации коллекции. Когда вызывется следующий элемент через next() проверяется modCount и если он изменен во время итерирования выбрасывается исключение

32
Q

Как устроена HashMap

A

Вкратце, HashMap состоит из «корзин» (bucket`ов). С технической точки зрения «корзины» — это элементы массива, которые хранят ссылки на списки элементов. При добавлении новой пары ключ-значение, вычисляет хеш-код ключа, на основании которого вычисляется номер корзины (номер ячейки массива), в которую попадет новый элемент. Если корзина пустая, то в нее сохраняется ссылка на вновь добавляемый элемент, если же там уже есть элемент, то происходит последовательный переход по ссылкам между элементами в цепочке, в поисках последнего элемента, от которого и ставится ссылка на вновь добавленный элемент. Если в списке был найден элемент с таким же ключом, то он заменяется. Добавление, поиск и удаление элементов выполняется за константное время. Вроде все здорово, с одной оговоркой, хеш-функций должна равномерно распределять элементы по корзинам, в этом случае временная сложность для этих 3 операций будет не ниже lg N, а в среднем случае как раз константное время.

33
Q

Какая оценка временной сложности выборки элемента из HashMap? Гарантирует ли HashMap указанную сложность выборки элемента?

A

константное время необходимо для выборки элемента

Если вы возьмете хеш-функцию, которая постоянно будет возвращать одно и то же значение, то HashMap превратится в связный список, с отвратной производительностью. Затем даже, если вы будете использовать хеш-функцию с равномерным распределением, в предельном случае гарантироваться будет только временная сложность lg N. Так что, ответ на вторую часть вопроса — нет, не гарантируется.

34
Q

Как между собой связаныIterableиIterator?

A

ИнтерфейсIterableимеет только один метод -iterator(), который возвращаетIterator.

35
Q

СравнитеIteratorиListIterator.

A

ListIteratorрасширяет интерфейсIterator

ListIteratorможет быть использован только для перебора элементов коллекцииList;

Iteratorпозволяет перебирать элементы только в одном направлении, при помощи методаnext(). Тогда какListIteratorпозволяет перебирать список в обоих направлениях, при помощи методовnext()иprevious();

ListIteratorне указывает на конкретный элемент: его текущая позиция располагается между элементами, которые возвращают методыprevious()иnext().

При помощиListIteratorвы можете модифицировать список, добавляя/удаляя элементы с помощью методовadd()иremove().Iteratorне поддерживает данного функционала.

36
Q

Что произойдет при вызовеIterator.next()без предварительного вызоваIterator.hasNext()?

A

Если итератор указывает на последний элемент коллекции, то возникнет исключениеNoSuchElementException, иначе будет возвращен следующий элемент.

37
Q

Сколько элементов будет пропущено, еслиIterator.next()будет вызван после 10-ти вызововIterator.hasNext()?

A

Нисколько -hasNext()осуществляет только проверку наличия следующего элемента.

38
Q

Как поведёт себя коллекция, если вызватьiterator.remove()?

A

Если вызовуiterator.remove()предшествовал вызовiterator.next(), тоiterator.remove()удалит элемент коллекции, на который указывает итератор, в противном случае будет выброшеноIllegalStateException().

39
Q

Как поведёт себя уже инстанциированный итератор дляcollection, если вызватьcollection.remove()?

A

При следующем вызове методов итератора будет выброшеноConcurrentModificationException.

40
Q

Как избежатьConcurrentModificationExceptionво время перебора коллекции?

A

Попробовать подобрать или реализовать самостоятельно другой итератор, работающий по принципу fail-safe.

ИспользоватьConcurrentHashMapиCopyOnWriteArrayList.

Преобразовать список в массив и перебирать массив.

Блокировать изменения списка на время перебора с помощью блокаsynchronized.

Отрицательная сторона последних двух вариантов - ухудшение производительности

41
Q

Какая коллекция реализует дисциплину обслуживания FIFO?

A

FIFO, First-In-First-Out («первым пришел-первым ушел») - по этому принципу построена коллекцияQueue.

42
Q

Какая коллекция реализует дисциплину обслуживания FILO?

A

FILO, First-In-Last-Out («первым пришел, последним ушел») - по этому принципу построена коллекцияStack.

43
Q

Зачем добавилиArrayList, если уже былVector?

A

Методы классаVectorсинхронизированы, аArrayList- нет;

По умолчанию,Vectorудваивает свой размер, когда заканчивается выделенная под элементы память.ArrayListже увеличивает свой размер только на половину.

Vectorэто устаревший класс и его использование не рекомендовано.

44
Q

Какое худшее время работы методаcontains()для элемента, который есть вLinkedList?

A

O(N). Время поиска элемента линейно пропорционально количеству элементов в списке

45
Q

Какое худшее время работы методаcontains()для элемента, который есть вArrayList?

A

O(N). Время поиска элемента линейно пропорционально количеству элементов с списке.

46
Q

Какое худшее время работы методаadd()дляLinkedList?

A

O(N). Добавление в начало/конец списка осуществляется за времяO(1).

47
Q

Какое худшее время работы методаadd()дляArrayList?

A

O(N). Вставка элемента в конец списка осуществляется за времяO(1), но если вместимость массива недостаточна, то происходит создание нового массива с увеличенным размером и копирование всех элементов из старого массива в новый.

48
Q

Предложите эффективный алгоритм удаления нескольких рядом стоящих элементов из середины списка, реализуемогоArrayList.

A

Допустим нужно удалитьnэлементов с позицииmв списке. Вместо выполнения удаления одного элементаnраз (каждый раз смещая на 1 позицию элементы, стоящие «правее» в списке), нужно выполнить смещение всех элементов, стоящих «правее»n + mпозиции наnэлементов «левее» к началу списка. Таким образом, вместо выполненияnитераций перемещения элементов списка, все выполняется за 1 проход. Но если говорить об общей эффективности - то самый быстрый способ будет с использованиемSystem.arraycopy(), и получить к нему доступ можно через метод -subList(int fromIndex, int toIndex

49
Q

Сколько необходимо дополнительной памяти при вызовеArrayList.add()?

A

Если в массиве достаточно места для размещения нового элемента, то дополнительной памяти не требуется. Иначе происходит создание нового массива размером в 1,5 раза превышающим существующий (это верно для JDK выше 1.7, в более ранних версиях размер увеличения иной).

50
Q

Сколько выделяется дополнительно памяти при вызовеLinkedList.add()?

A

Создается один новый экземпляр вложенного классаNode.

51
Q

Оцените количество памяти на хранение одного примитива типаbyteвArrayList?

A

ArrayListоснован на массиве, для примитивных типов данных осуществляется автоматическая упаковка значения, поэтому 16 байт тратится на хранение упакованного объекта и 4 байта (8 для x64) - на хранение ссылки на этот объект в самой структуре данных. Таким образом, в x32 JVM 4 байта используются на хранение одного элемента и 16 байт - на хранение упакованного объекта типаByte. Для x64 - 8 байт и 24 байта соответственно.

52
Q

ДляArrayListили дляLinkedListоперация добавления элемента в середину (list.add(list.size()/2, newElement)) медленнее?

A

ДляArrayList:

проверка массива на вместимость. Если вместимости недостаточно, то увеличение размера массива и копирование всех элементов в новый массив (O(N));

копирование всех элементов, расположенных правее от позиции вставки, на одну позицию вправо (O(N));

вставка элемента (O(1)).

ДляLinkedList:

поиск позиции вставки (O(N));

вставка элемента (O(1)).

В худшем случае вставка в середину списка эффективнее дляLinkedList. В остальных - скорее всего, дляArrayList, поскольку копирование элементов осуществляется за счет вызова быстрого системного методаSystem.arraycopy().

53
Q

Как работает fail-safe iterator

A

Для итерация создается копия коллекции и изменения не влияют, exception не выбрасывается. Достоверность данных не гарантируется.
ПРимеры: ConcurrentHashMap, CopyonWriteArrayList
Как работает : для итераций создается снимок, в снимке изменения не отражаются. Операции add, set, remove над итератором не поддерживаются - будет выброшено исключение UnsupportedOperationException

54
Q

Почему LinkedList реализует и List, и Deque?

A

LinkedList позволяет добавлять элементы в начало и конец списка за константное время, что хорошо согласуется с поведением интерфейса Deque.

55
Q

В реализации класса ArrayList есть следующие поля: Object[] elementData, int size. Объясните, зачем хранить отдельно size, если всегда можно взять elementData.length?

A

Размер массива elementData представляет собой вместимость (capacity) ArrayList, которая всегда больше переменной size - реального количества хранимых элементов. При необходимости вместимость автоматически возрастает.

56
Q

LinkedList — это односвязный, двусвязный или четырехсвязный список?

A

Двусвязный: каждый элемент LinkedList хранит ссылку на предыдущий и следующий элементы.

57
Q

Как перебрать элементы LinkedList в обратном порядке, не используя медленный get(index)?

A

Для этого в LinkedList есть обратный итератор, который можно получить вызва метод descendingIterator().

58
Q

Что позволяет сделать PriorityQueue?

A

Особенностью PriorityQueue является возможность управления порядком элементов. По-умолчанию, элементы сортируются с использованием «natural ordering», но это поведение может быть переопределено при помощи объекта Comparator, который задаётся при создании очереди. Данная коллекция не поддерживает null в качестве элементов.

Используя PriorityQueue, можно, например, реализовать алгоритм Дейкстры для поиска кратчайшего пути от одной вершины графа к другой. Либо для хранения объектов согласно определённого свойства.

59
Q

Расскажите реализации интерфейса Map?

A

HashMap - не синхронизированная хэш-таблица (быстрая).

LinkedHashMap - упорядоченная хэш-таблица с порядком итерирования в порядке добавления.

TreeMap - Упорядоченная по ключам. Основана на красно-черных деревьях. Может использовать компаратов в конструкторе.

60
Q

Расскажите реализации интерфейса List?

A

ArrayList - на массиве с несинхронизированными методами.

Vector - на массиве с синхронизированными методами.

Stack - на массиве есть синхронизированные методы но не все.

LinkedList - двусвязный список.