Big O нотация
8.10M
Category: programmingprogramming

Java коллекции

1.

Java коллекции
astondevs.ru

2.

Big O

3. Big O нотация

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

4.

Что такое коллекции и для чего они нужны
• Коллекции — это контейнеры, которые группируют несколько элементов в единое
целое.
• Они обеспечивают архитектуру для хранения и управления группой объектов.
• С помощью коллекций Java можно выполнять различные операции с данными, такие
как поиск, сортировка, вставка, обработка, удаление и т. д.
• Фреймворк Java Collection предоставляет множество интерфейсов и классов таких
как List(ArrayList, LinkedList, Vector), Queue(PriorityQue, ArrayDeque), Set(HashSet,
LinkedHaset, TreeSet)

5.

Несколько слов о коллекциях
• Примитивные типы нельзя хранить в коллекции.
• Коллекции могут хранить только ссылки на объекты
• Классы коллекций хранятся в пакете java.util.
• Библиотека классов и интерфейсов для поддержки коллекций называется Java
collections framework (JCF). Он появился начиная с версии Java 1.2. В версии 1.5 в
JCF добавили поддержку дженериков.

6.

Иерархия

7.

Iterable
Интерфейс Iterable является корневым интерфейсом для всех
классов коллекций.
В нем определены следующие методы:
Iterator<T> iterator()
default void forEach(Consumer<? super T> action)
default Spliterator<T> spliterator() // Создает spliterator на основе
// итератора

8.

Итераторы в JCF
• interface Iterator<E>
• interface Listiterator<E>
• interface Spliterator<T>
• interface Enumeration<E>

9.

Вопрос на 0,5 балла
Какое поведение реализуют итераторы всех коллекций, не входящих
в пакет concurrent, fail-fast или fail-safe?

10.

Итератор
java.util.Iterator – интерфейс предоставляющий API для работы с
коллекцией.
Итератор – это специальный внутренний объект в коллекции,
который с одной стороны имеет доступ ко всем ее private данным
и знает ее внутреннюю структуру, с другой – реализует
общедоступный интерфейс Iterator, благодаря чему все знают,
как с ним работать.

11.

Итератор
Главное предназначение итераторов заключается в
предоставлении возможности пользователю обращаться к
любому элементу контейнера при сокрытии внутренней
структуры контейнера от пользователя.
Это свойство позволяет контейнеру хранить элементы любым
способом при допустимости работы пользователя с ним как с
простой последовательностью или списком.

12.

13.

Методы интерфейса Collection
• add(E e) - добавить элемент;
• addAll(Collection<?extends E> c) - добавить элементы из другой
коллекции;
• clear() - удалить все элементы;
• contains(Object o) - находится ли указанный объект в коллекции;
• containsAll(Collection<?> c) - содержатся ли указанные объекты в
коллекции;
• isEmpty() - является ли коллекция пустой;

14.

Методы интерфейса Collection
• remove(Object o) - удаляет указанный объект из коллекции, если он есть
там;
• removeAll(Collection<?> c) - удалить указанные объекты;
• retainAll(Collection<?> c) - оставить в коллекции только указанные
объекты;
• size() - размер коллекции в элементах;
• toArray() - возвращает массива объектов, содержащий все элементы
коллекции;
• toArray(T[] a) - возвращает массива объектов, содержащий все
элементы коллекции. Если аргумента a null, то создается новый массив в
который копируются элементы.

15.

Вопрос на 0,5 балла
В интерфейсе Collection нет метода sort(), как в таком случае
отсортировать коллекцию?

16.

Списки

17.

Особенности списков
• Хранит элементы последовательно
• Добавляет API работы с индексами (индексация начинается с 0)
• Добавляет ListIterator
• Позволяет хранить дубликаты

18.

Методы интерфейса List
• add(int ind, E e) - добавляет элемент в указанную позицию;
• addAll(int ind, Collection<? extends E> c) - добавляет элементы в
указанную позицию;
• get(int ind) - возвращает элемент в указанной позиции;
• indexOf(Object o) - возвращает индекс указанного объекта, или -1 если
егонет в списке;
• lastIndexOf(Object o) - найти последнее вхождение указанного объекта,
или -1 если его нет в списке

19.

Методы интерфейса List
• listIterator() - списочный итератор;
• listIterator(int ind) - списочный итератор с указанной позиции;
• remove(int index) - возвращает элемент в указанной позиции, удаля его;
• set(int index, E el) - заменяет элемент в указанной позиции;
• subList(int fromInd, int toInd) - возвращает часть списка, т.е. элементы в
диапазоне [fromIndex; toIndex). Не возвращает новый лист, а ссылается на
this лист

20.

Интерфейс ListIterator
Списки, независимо от реализации обладают порядком элементов, что в
свою очередь позволяет работать с ними через итератор чуть более
удобно. Добавлена возможность итерирования в обе стороны, методы для
получения prev/nextIndex при этом курсор не сдвигается.

21.

Методы интерфейса ListIterator
• void add(Е obj) - вставляет obj перед элементом, который должен быть
возвращен следующим вызовом next().
• boolean hasNext() - возвращает true, если есть следующий элемент. В
противном случае возвращает false.
• boolean hasPrevious() - возвращает true, если есть предыдущий
элемент. В противном случае возвращает false.
• Е next() - возвращает следующий элемент. Если следующего нет,
инициируется исключение NoSuchElementException.
• int nextIndex() - возвращает индекс следующего элемента. Если
следующего нет, возвращается размер списка.

22.

Методы интерфейса ListIterator
• Е previous() - возвращает предыдущий элемент. Если предыдущего
нет, инициируется исключение NoSuchElementException.
• int previousIndex() - возвращает индекс предыдущего элемента. Если
предыдущего нет, возвращается -1.
• void remove() - удаляет текущий элемент из списка. Если remove()
вызван до next() или previous(), инициируется исключение
IllegalStateException.
• void set(Е obj) - присваивает obj текущему элементу. Это элемент,
возвращенный последним вызовом next() или previous().

23.

Классы которые реализуют List
• ArrayList
• LinkedList
• Vector
• Stack

24.

25.

ArrayList
• Является реализацией динамического массива.
• Объект класса ArrayList, содержит свойства elementData и size.
• Обладает наибольшей производительностью в плане доступа к
случайному элементу в массиве.
• Если вызывается конструктор без параметров, то по умолчанию будет
создан массив из 10-ти элементов типа Object (с приведением к типу)
• Имплементирует RandomAccess маркерный интерфейс, указывает что
поддерживает быстрый random access

26.

Конструкторы класса ArrayList
• ArrayList() - помогает создать пустую коллекцию.
• ArrayList(Collection <? extends Е> сollection) - создает коллекцию и
заполняет ее элементами из передаваемой коллекции collection.
• ArrayList(int capacity) - помогает создать пустую коллекцию с
внутренним массивом, размер которого будет равен значению
параметра capacity.

27.

Достоинства и недостатки ArrayList
Достоинства
• Быстрый доступ по индексу. Скорость такой операции - O(1).
• Быстрая вставка и удаление элементов с конца. Скорость операций
опять же - O(1).
Недостатки
• Медленная вставка и удаление элементов из середины. Такие
операции имеют сложность близкую к O(n). Поэтому, если вы
понимаете, что вам придется выполнять достаточно много операций
такого типа, может быть лучше выбрать другой класс.

28.

Демонстрация добавления элемента

29.

Вставка элемента в середину, когда ArrayList полон
• Создается новый массив размером, в 1.5 раза больше исходного, плюс один
элемент.
• Все элементы из старого массива копируются в новый массив
• Новый массив сохраняется во внутренней переменной объекта ArrayList, а
старый массив объявляется мусором.

30.

Демонстрация удаления элемента

31.

Вопрос на 0,5 балла
Что произойдет с исходным массивом если мы решим удалить
половину элементов?

32.

Демонстрация работы функции
trimToSize()

33.

LinkedList
• Данные хранятся в объектах типа

34.

Факты о LinkedList
• Реализует 2 интерфейса List и Deque.
• В отличии от AL наследует AbstractSequentialList
• Операции, которые индексируются, будут перемещаться по списку от
начала или конца, в зависимости от того, что ближе к указанному
индексу

35.

Работа с LinkedList
Допустим у нас есть
следующий класс

36.

Структура LinkedList
Структура такого LinkedList будет выглядеть следующим образом:

37.

Добавление в конец LinkedList

38.

Добавление в середину LinkedList

39.

Удаление из середины в LinkedList

40.

Методы удаления

41.

Сравнение ArrayList и LinkedList
Проще запомнить, если знаешь про RandomAccess и AbstractSequentialList

42.

От слов к цифрам

43.

Вопрос на 0,5 балла
Как реализованы методы equals и hashCode в ArrayList?

44.

Java Map

45.

Контракт методов hashCode() и equals()
• Для одного и того же объекта, хеш-код всегда будет одинаковым.
• Если объекты одинаковые, то и хеш-коды одинаковые (но не наоборот).
• Если хеш-коды равны, то входные объекты не всегда равны.
• Если хеш-коды разные, то и объекты гарантированно будут разные.

46.

Свойства методов hashCode() и equals()
• Рефлексивность: x.equals(x) вернет true; (при условии, что x != null)
• Симметричность: Если x.equals(y) вернет true, то y.equals(x) так же вернет
true.
• Транзитивность: Если x.equals(y) и y.equals(z) возвращают true, тогда и
x.equals(z) вернёт true;
• Непротиворечивость: Если несколько раз подряд вызывать х.equals(y), то
всегда будет один и тот же результат. (при условии, что никакая
информация, используемая при сравнении объектов, не поменялась)
• Для любой ненулевой ссылки на значение х выражение х.equals(null)
должно возвращать false.

47.

Map
• Хранит пары ключ-значение.
• Ключи и значения являются объектами. Ключи должны быть
уникальными, а значения могут быть дублированными. Уникальность
ключей определяет реализация метода equals().
• Для корректной работы с картами необходимо переопределить методы
equals() и hashCode(). Допускается добавление объектов без
переопределения этих методов, но найти эти объекты в Map вы не
сможете.

48.

Иерархия

49.

Методы интерфейса Map
void clear() - удаляет все пары "ключ-значение".
boolean containsKey(Object k) - возвращает true, если мапа содержит ключ k.
boolean containsValue(Object v) - возвращает true, если мапа содержит значение v.
Set<Map. Entry<K, V> entrySet() - возвращает Set, содержащий все значения карты.
Набор содержит объекты типа Мар.Entry. То есть этот метод представляет мапу в виде
множества.
• V get(Object K) - возвращает значение, ассоциированное с ключом k. Возвращает null,
если ключ не найден.
• boolean isEmpty() - возвращает true, если мапа пуста. В противном случае возвращает
false.

50.

Методы интерфейса Map
• Set<K> keySet() - возвращает Set, который содержит ключи.
• V put(К k, V v) - помещает элемент в мапу, перезаписывая любое предшествующее
значение, ассоциированное с ключом. Ключ и значение это k и v соответственно.
Возвращает null, если ключ ранее не существовал. В противном случае возвращается
предыдущее значение, связанное с ключом.
• void putAll(Мар<? extends К, ? extends V> m) - помещает все значения из m в мапу.
• V remove(Object k) - удаляет элемент, чей ключ равен k.
• int size() - возвращает число пар "ключ-значение" в мапе.
• Collection<V> values() - возвращает коллекцию, содержащую значения мапы.

51.

Основные классы, которые реализуют Map
• AbstractMap<K, V>
• HashMap<K, V>
• TreeMap<K, V>
• WeakHashMap<K, V>
• LinkedHashMap<K, V>

52.

Факты о HashMap
• Позволяет хранить null ключ (только 1) и null значения (сколько угодно).
• Не сохраняет порядок хранения элементов, более того не гарантирует,
что последовательность будет сохранена.
• Максимальная capacity = половине int (1073741824)
• Большинство методов имеют константную сложность O(1), при условии,
что hashCode реализован адекватно (равномерная дисперсия).
• Есть 3 параметра, которые влияют на производительность мапы:
- initial capacity - изначальный размер исходного массива, по def 16
- load factor – коэффициент загрузки, по def = 0.75
- threshold — предельное количество элементов, при котором, размер
хэш-таблицы увеличивается вдвое (capacity * loadFactor)

53.

Хранение данных

54.

Как это выглядит

55.

Вопрос на 0,5 балла
Что произойдет если мы положим в мапу ключ и значение, а после поменяем
данные в ключе, на основе которых рассчитывается hashCode?

56.

Ответ
При создании Node рассчитывается hash и кэшируется => если hashCode
ключа поменяется, то найти его в мапе будет невозможно

57.

Добавление элемента в HashMap
При добавлении нового элемента в HashMap с помощью метода put(key, value)
выполняются следующие действия:
• Высчитывается значения hashCode у ключа с помощью одноименной функции
• Определяется бакет(ячейка массива) в которую будет добавлен новый элемент.
Номер определяется по остатку от деления хэшкода на кол-во ячеек. В более новых
версиях Java с помощью бинарного сдвига.
• Далее, если бакет пустой - то элемент просто добавляется. Если не пустой, то, там
односвязный список.
• Если бакет не пустой - мы идем по этому списку и сравниваем ключ добавляемого
элемента и ключ элемента в списке по хэшкодам.
• Если хэшкоды неравны, то идем к следующему элементу
• Если хэшкоды равны, то далее сравниваем по Equals.
• Если ключи равны по Equals, то перезаписываем value по этому ключу
• Если ключи не равны по Equals, то переходим к следующему элементу
• Если мы не нашли ключ в списке, то мы добавляем этот элемент в конец списка

58.

Пример добавления с коллизией

59.

Вопрос на 1 балл
Всегда ли коллизия будет решаться методом цепочек
(формированием односвязного списка)?

60.

Пример использования HashMap

61.

Факты о LinkedHashMap
• Наследует HashMap, в самом классе переопределены
утилитные методы создания новых Node. => все что применимо к
HM, применимо и к LHM.
• Сохраняет порядок вставки.
• Есть конструктор, который создает LHM, порядок итерации
которой будет происходить от least-recently accessed to mostrecently entries.

62.

Факты о TreeMap
• Является красно черным бинарным деревом.
• Распределение Entries происходит за счет сравнения (сортировки)
ключей.
• Ключи сравниваются либо за счет natural ordering (Comparable), либо за
счет Comparator, который передается в конструкторе.
• В отличие от других мап не использует принципы hashCode/equals!
• Если ключ == null – NullPointerException, значения могут быть null.
• Если вы создали собственный класс для ключей и не реализовали
интерфейс Comparable (и не используете Comparator), то при попытке
добавления объекта в коллекцию будет брошено
исключение java.lang.ClassCastException.

63.

Конструкторы класса TreeMap
• TreeMap()
• TreeMap(Comparator<? super К> сотр)
• TreeMap(Map<? extends К, ? extends V> т)
• TreeMap(SortedМap<K, ? extends V> sm)

64.

Красно-чёрное дерево

65.

Правила красно-черного дерева
• Узел может быть либо красным, либо чёрным и имеет двух потомков;
• Корень — как правило чёрный(Как правило - потому что, если мы
говорим о поддеревьях - это не всегда так)
• Все листья, не содержащие данных — чёрные.
• Оба потомка каждого красного узла — чёрные.
• Любой простой путь от узла-предка до листового узла-потомка содержит
одинаковое число чёрных узлов. Простой путь – это тот в котором
каждый узел входит ровно по одному разу

66.

SortedMap и NavigableMap
За счет того, что TreeMap хранит данные в отсортированном виде, у
разработчиков java была возможность реализовать ряд удобных методов.
Эти методы были вынесены в интерфейсы SortedМap и NavigableMap.

67.

SortedMap
Интерфейс SortedМap расширяет Мар и гарантирует, что элементы размещаются в
возрастающем порядке значений ключей.
• К firstKey() - возвращает первый ключ вызывающей карты.
• К lastKey() - возвращает последний ключ вызывающей карты.
• SortedМap<K, V> headМap(К end) - Возвращает сортированную карту, содержащую те
элементы вызывающей карты, ключ которых меньше end.
• SortedМap<K, V> subMap(К start, К end) - возвращает карту, содержащую элементы
вызывающей карты, чей ключ больше или равен start и меньше end.
• SortedМap<K, V> tailMap (К start) - возвращает сортированную карту, содержащую те
элементы вызывающей карты, ключ которых больше start.

68.

NavigableMap
Интерфейс NavigableMap был добавлен в Java 6. Он расширяет
SortedМap и определяет поведение мапы, поддерживающей
извлечение элементов на основе ближайшего соответствия
заданному ключу или ключам (навигация по ключам).

69.

Методы интерфейса NavigableMap
• Map.Entry<K, V> ceilingEntry(K key): возвращает элемент с наименьшим
ключом k, который больше или равен ключу key (k >=key) else null.
• Map.Entry<K, V> floorEntry(K key): возвращает элемент с наибольшим ключом
k, который меньше или равен ключу key (k <=key), else null.
• Map.Entry<K, V> higherEntry(K key): возвращает элемент с наименьшим
ключом k, который больше ключа key (k >key), else null.
• Map.Entry<K, V> lowerEntry(K key): возвращает элемент с наибольшим ключом
k, который меньше ключа key (k <key), else null.

70.

Пример использования класса TreeMap

71.

Вопрос на 0.5 балла
Какая алгоритмическая сложность у основных методов TreeMap
(put/remove…)?

72.

IdentityHashMap и WeakHashMap самоизучение!!!
- Изучить что такое Identity Hash и как используется в IdentityHashMap
- Изучить типы ссылок (WeakReference/StrongReference и тд) и как работает
WeakHashMap
* Эти темы часто пропускают, поэтому советую по ним готовить вопросы изи баллы, но я этого не говорил ;)

73.

Set
• Является реализацией структуры данных «множество».
• Не поддерживает хранение дубликатов. Set не может содержать
пары элементов e1 и e2 если e1.equals(e2) и не более одного null
элемента.
• Особое внимание необходимо уделить элементам, которые могут
изменяться. В поведении Set не указано, что делать если значение
элемента Set изменилось таким образом, что объект стал равен
другому объекту из множества.

74.

Иерархия Set

75.

76.

HashSet

77.

Следствия того, что HashSet это “HashMap”
• Та же алгоритмическая сложность для всех операций
• Те же load factor и initial capacity
• Та же реализация вставки/удаления/поиска и тд
• Тот же контракт на equals&hashCode

78.

Пример использования HashSet
В данном пример последняя запись не будет добавлена т.к. она уже есть

79.

LinkedHashSet
• Класс LinkedHashSet языка Java расширяет HashSet, не добавляя
никаких новых методов. Добавляются только конструкторы, которые
вызывают “dummy” конструкторы в HashSet, которые в свою очередь
инициализируют мапу, на основе которой работают в LHM.
• Из первого тезиса следует, что LHS это LHM, следовательно, хотите
знать, как работает LHS учите LHM.

80.

Здесь не
хватает только
одного метода.
Какого именно
не скажу.

81.

TreeSet
• Да, TreeSet основан на TreeMap
• Та же алгоритмическая сложность для всех операций
• То же красно черное дерево
• Та же реализация вставки/удаления/поиска и тд
• Так же не используется контракт на equals&hashCode, вместо этого используются
Comparable/Comparator
• Имплементирует аналог NavigableTreeMap - NavigableTreeSet

82.

TreeSet под капотом

83.

Очереди

84.

Queue
• Работает по принципу FIFO.
• Большая часть методов существует в “Безопасной” форме и “Не
Безопасной”
• Существует 2 вида очередей, блокирующие и не блокирующие.

85.

Не безопасные методы
• boolean add(Е оbj) - пытается добавить оbj в очередь.
Возвращает true, если оbj добавлен, и IllegalStateException если
места нет.
• Е element() - возвращает элемент из головы очереди. Элемент не
удаляется. Если очередь пуста, инициируется исключение
NoSuchElementException.
• Е remove() - удаляет элемент из головы очереди, возвращая его.
Инициирует исключение NoSuchElementException, если очередь
пуста.

86.

Безопасные методы
• boolean offer(Е оbj) - пытается добавить оbj в очередь. Возвращает
true, если оbj добавлен, и false в противном случае
• Е peek() - возвращает элемент из головы очереди. Возвращает null,
если очередь пуста. Элемент не удаляется.
• Е роll() - возвращает элемент из головы очереди и удаляет его.
Возвращает null, если очередь пуста

87.

Пример использования Queue

88.

Deque
• Интерфейс Deque появился в Java 6. Он расширяет Queue и
описывает поведение двунаправленной очереди.
• Двунаправленная очередь может функционировать как
стандартная очередь FIFO либо как стек LIFO.

89.

Методы интерфейса Deque
• void addFirst(Е obj) - добавляет obj в голову двунаправленной
очереди. Бросит исключение IllegalStateException, если в очереди
ограниченной емкости нет места.
• void addLast(Е obj) - добавляет obj в хвост двунаправленной очереди.
бросит исключение IllegalStateException, если в очереди ограниченной
емкости нет места.
• Е getFirst() - возвращает первый элемент двунаправленной очереди.
Объект из очереди не удаляется. В случае пустой двунаправленной
очереди бросит исключение NoSuchElementException.
• Е getLast() - возвращает последний элемент двунаправленной
очереди. Объект из очереди не удаляется. В случае пустой
двунаправленной очереди бросит исключения NoSuchElementException.

90.

Методы интерфейса Deque
• boolean offerFirst(Е obj) - пытается добавить obj в голову двунаправленной
очереди. Возвращает true, если obj добавлен. Метод возвращает false при
попытке добавить obj в полную двунаправленную очередь ограниченной
емкости.
• boolean offerLast(E obj) - пытается добавить obj в хвост двунаправленной
очереди. Возвращает true, если obj добавлен, и false в против ном случае.
• Е рор() - возвращает элемент, находящийся в голове двунаправленной
очереди, одновременно удаляя его из очереди. Бросит исключение
NoSuchElementException, если очередь пуста.
• void push(Е obj) - добавляет элемент в голову двунаправленной очереди.
Если в очереди фиксированного объема нет места, бросит исключение
IllegalStateException.

91.

Методы интерфейса Deque
• Е peekFirst() - возвращает элемент, находящийся в голове
двунаправленной очереди. Возвращает null, если очередь пуста.
Объект из очереди не удаляется.
• Е peekLast() - возвращает элемент, находящийся в хвосте
двунаправленной очереди. Возвращает null, если очередь пуста.
Объект из очереди не удаляется.
• Е pollFirst() - возвращает элемент, находящийся в голове
двунаправленной очереди, одновременно удаляя его из очереди.
Возвращает null, если очередь пуста.
• Е pollLast() - возвращает элемент, находящийся в хвосте
двунаправленной очереди, одновременно удаляя его из очереди.
Возвращает null, если очередь пуста.

92.

Методы интерфейса Deque
• Е removeLast() - возвращает элемент, находящийся в конце
двунаправленной очереди, удаляя его в процессе. Бросит исключение
NoSuchElementException, если очередь пуста.
• Е removeFirst() - возвращает элемент, находящийся в голове
двунаправленной очереди, одновременно удаляя его из очереди.
Бросит исключение NoSuchElementException, если очередь пуста.
• boolean removeLastOccurrence(Object obj) - удаляет последнее
вхождение obj из двунаправленной очереди. Возвращает true в случае
успеха и false если очередь не содержала obj.
• boolean removeFirstOccurrence(Object obj) - удаляет первое
вхождение obj из двунаправленной очереди. Возвращает true в случае
успеха и false, если очередь не содержала obj.

93.

Классы, которые реализуют Очереди
Стандартные реализации
• LinkedList
• ArrayDeque
• PriorityQueue
Неблокирующие очереди
• ConcurrentLinkedQueue
• ConcurrentLinkedDeque

94.

Блокирующие очереди

95.

ArrayDeque
• Является реализацией двунаправленной очереди.
• Основан на массиве, который при необходимости растет
• Большинство операций имеют константную сложность, за исключением
тех, который требуют прохождения по массиву.

96.

Пример использования ArrayDeque

97.

PriorityQueue
PriorityQueue – это класс очереди с приоритетами. По умолчанию
очередь с приоритетами размещает элементы согласно естественному
порядку сортировки используя Comparable. Элементу с наименьшим
значением присваивается наибольший приоритет.
Если несколько элементов имеют одинаковый наивысший элемент – связь
определяется произвольно. Также можно указать специальный порядок
размещения, используя Comparator.

98.

Конструкторы класса PriorityQueue
• PriorityQueue() - создает очередь с приоритетами начальной емкостью
11, размещающую элементы согласно естественному порядку
сортировки (Comparable);
• PriorityQueue(Collection<? extends E> c);
• PriorityQueue(int initialCapacity);
• PriorityQueue(int initialCapacity, Comparator<? super E> comparator);
• PriorityQueue(PriorityQueue<? extends E> c);
• PriorityQueue(SortedSet<? extends E> c).

99.

Пример
использования
PriorityQueue

100.

Быстродействие операций
English     Русский Rules