Java Collection Framework — part 1
Источник: блог Блокнотик, 2 апреля 2012 г.,
http://moritur.blogspot.ru/2012/04/java-collection-framework-part-1.html Огромное количество классов для работы с колекциями в Java, может пугать. Но за ними кроются конкретные реализации алгоритмов, применение которых сделают ваши програмы более читабельными, быстрими и стабильными. Ниже представлена краткая и агрегированая информация по интерфейсах и классах. Выбрав нужный не забудте посмотреть подробности в Java API.
Интерфейсы:
- Collection: — описывает группу объектов (элементов). Определяет методы для получения итератора, добавления, удаления элементов, проверки на вхождение элемента в даную колекцию, преобразования колекции к масиву.
При помощи утилитного класса java.util.Collections вы можете произвести такие действия над вашей колекцией:- synchronizedCollection — синхронизирует все методы (реализуя паттерн Decorator)
- unmodifiableCollection — возвращает колекцию при попытке модификации которой будет брошено исключение UnsupportedOperationException(реализация — паттерн Decorator)
- checkedCollection — возвращает колекцию гарантированно содержащую заданый тип. При попытке вставить элемент другого типа будет брошено исключение ClassCastException(реализация — паттерн Decorator)
- sort — стабильная сортировка модифицированым методом mergesort, сложность O(n log(n)))
- binarySearch — поиск элемента в отсортированой колекции. Сложность для RandomAcсess листов O(log n), иначе O(n)
- copy — копирует все элементы в доругой список
- fill — заполняет лист одним и тем же элементом
- indexOfSubList, lastIndexOfSubList — возвращает первый (последний) индекс вхождения одного списка в другой, или же -1, Использует «brute force» стратегию 🙂
- shuffle — рандомно перемешывает список, сложность O(n)
- swap — меняет два элемента списка местами
- reverse — разворачивает список, сложность O(n)
- rotate — сдвигает элементы списка, сложность O(n)
- add(e), element(), remove() — добавить, достать, удалить, при запрете операции в данный момент (отсутствии элементов, или заполнености очереди) бросается исключение IllegalStateException
- offer(e), poll() — добавить/извлечть элемент, без блокировки потока, при запрете операции будет возвращен результат false или null
- offer(e, time, unit), poll(time, unit) — добавить/извлечь элемент, c блокировкой не дольше заданого интервала
- put(e), take() — добавить/извлечть элемент c блокировкой потока до выполнения операции
- drainTo(Collection) — извлечь все элементы из очереди и поместить в колекцию
Классы:
- ArrayList: — представляет масив длинна которого меняется автоматически (динамический масив)
Сойства:- методы не синхронизированы (нельзя использовать в нескольких потоках)
- сложность операций size, isEmpty, get, set, iterator, listIterator, add — O(1)
- add — работает медленнее чем в LinkedList
- Если был получен iterator или listIterator, а затем была изменена структура списка, будет брошен ConcurrentModificationException. Но это поведение не гарантируется при изменении структуры несколькими потоками
- методы синхронизированы (безопасно использовать в нескольких потоках, но меньшая производительность при работе с одним)
- setSize — устанавливает новый размер масива
- add(int index,E element) добавляет элемент в определенную позицию, или же бросает ArrayIndexOutOfBoundsException
- Не рекомендуется завязывать логику программы на ConcurrentModificationException, несмотря на синхронизированость методов. Это исключение призвано только для выявления багов
- К методам Vector добавляет push(e), pop()
- методы синхронизированы
- Более согласованую абстракцию LIFO представляет интерфейс Deque и его реализация ArrayDeque
- Все операции изменяющие структуру применяются к новой копии существующего масива данных. Для быстрого копирования используется нейтивные системные функции. Тоесть если один поток хочет читать масив — он получает снимок текущего масива и дальше читает его (возможно устаревшие данные), а другой в это время, может без боязненно его изменять.
- Операции связанные с изменением структуры синхронизированны. Тоесть в любой момент временни только один поток может изменять структуру
- Операции связанные с чтением не блокируют запись
- Вы не сможете изменять структуру данного листа через итератор (так как итератор работает с более старым снимком данных). Операции итератора remove, set, add будут бросать UnsupportedOperationException
- Методы не синхронизированы (нельзя использовать в нескольких потоках)
- Сложность операций get, isEmpty, remove, insert — в конец и начало списка одинакова (O(1))
- Сложность операций get(index) — O(n)
- Если был получен iterator или listIterator, а затем была изменена структура списка, будет брошен ConcurrentModificationException. Но это поведение не гарантируется при изменении структуры несколькими потоками
- Методы не синхронизированы (нельзя использовать в нескольких потоках), многопоточная реализация PriorityBlockingQueue
- Сложность операций получения елемнетовpeek, element, size — O(1)
- Сложность операций вставки и извлеченияoffer, poll, remove(), add — O(log(n)
- Сложность операций доступа к конкретному элементу remove(Object), contains(Object) — O(n)
- iterator() — обходит очередь в произвольном порядке
- Для обхода кучи в порядке убывания/возростания элементов используйте конструкцию Arrays.sort(pq.toArray()) — сложность O(n*log(n))
- Методы не синхронизированы, но структура этой очереди позволяет множеству потоков работать с одной и той же очередью безопасно
- Сложность операции size — O(n)!
- Методы не синхронизированы (нельзя использовать в нескольких потоках)
- Сложность операций добавления и извлечения элементов в оба конца очереди — O(1)
- Сложность операций для работы с конкретным элементом remove(Object), contains, iterator.remove() — O(n)
- Если был получен iterator или descendingIterator, а затем была изменена структура очереди, будет брошен ConcurrentModificationException. Но это поведение не гарантируется при изменении структуры несколькими потоками
- После создания нельзя изменить размер буффера
- При создании можно задать размер буфера, по умолчанию он неограничен. После создания изменять размер буффера нельзя
- Очередь не ограничена, но можно нарватся на OutOfMemoryError
- Сложность добавления, извлечения элементов O(1) (не считая затраты на блокирову)
- Сложность изменения, получения конкретного элемента O(n) (не считая затраты на блокирову)
- При создании можно задать размер буфера, по умолчанию он неограничен. После создания изменять размер буффера нельзя
- Очередь не ограничена, но можно нарватся на OutOfMemoryError
- Каждому элементу задается свое время после которого он станет доступен, для чтения в очереди
- size() — возвращает общее число как доступных так и не доступных элементов
- Очередь не ограничена, но можно нарватся на OutOfMemoryError
- При создании можно задать размер буфера, по умолчанию он неограничен. После создания изменять размер буффера нельзя
- Очередь не ограничена, но можно нарватся на OutOfMemoryError
- Сложность добавления, извлечения элементов с обоих концов очереди O(1) (не считая затраты на блокирову)
- Сложность изменения, получения конкретного элемента (remove(Object), contains(Object), iterator.remove()) O(n) (не считая затраты на блокирову)
Как поместить выполнение методов в очередь?
Этот интерфейс, как ясно из названия — обертка для метода, который добавляется в очередь. Интерфейс нужно реализовать (как это делать смотрите ниже, где код) и в метод execute() добавить тело метода, который надо поместить в очередь.
и как вообще вся эта конструкция работает
- Создается очередь для объектов, реализующих интерфейс MethodWrapper.
- methodsQueue.poll() возвращает первый элемент очереди и удаляет его, т. е. на выходе имеем объект, реализующий MethodWrapper.
- В полученном MethodWrapper вызывается метод execute() , т. е. метод, помещенный в очередь. Интерфейс нужен был для того, чтобы этот метод выполнял код, который нужен именно вам.
Вот пример использования (взял ваш код за основу):
public interface MethodWrapper < void execute(); >public class Potato extends Thread < QueuemethodsQueue = new LinkedList<>(); public Potato () < methodsQueue.add(() ->< // Тело метода, который нужно поставить в очередь. >); > public void run() < methodsQueue.poll().execute(); >>
Я использовал лямбда-функцию, но если вам нужен именно анонимный класс (для Java 7), то вот код:
methodsQueue.add(new MethodWrapper() < @Override public void execute() < // Тело метода >>);
Коллекции Queue — Java — Ответ 16478121
Добрый день! Сейчас прохожу тест по Java по коллекциям Queue. Не могу разобраться до конца с этими двумя вопросами. Помогите, пожалуйста.
Что все очереди (Queue) обязаны уметь делать?
— Отвечать на вопрос о своём размере
— Удалять элемент из очереди, переданный параметром
— Цикл for-each
— Отдавать элемент по его индексуКакой из методов меняет очередь?
Меню пользователя @ MSYJSprogram 94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Готовые ответы и решения:Сортировка фамилий в Queue
Помогите пожалуйста. Нужно отсортировать фамилии из файлу по возрастанию и вывести N фамилий, но в.Задача связанное с Stack, Queue, HeapFile
Здравствуйте, у меня появилось проблема с задачкой,из за того что не понял началные темы,я не.Метод remove() для класа Queue с итератором
Ребят, возникла проблема. Нужно удалять элемент, если был вызван метод remove() после next(), т.е.В коллекции найти минимальное, максимальное значения, а также общую сумму коллекции
Всем привет! Помогите пожалуйста решить задачу( В коллекции найти минимальное, максимальное.Queue(sort)
Есть Queue<Fruit> fruitQue= new LinkedList<Fruit>(); Нужно отсортировать с помощью компаратора.87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесьПерехват JMS Queue
Существует ли способ паралельного перехвата месаджа из JMS Queue для анализа, между продюсером и.Передача Queue, как параметра метода
Подскажите пожалуйста, как нужно писать параметр метода для коллекции Queue. К примеру коллекция.Интерфейс Queue. Зачем дублируются методы
Доброго времени суток. Насколько я знаю — интерфейс Queue добавляет дополнительные операции.Очереди. Перегрузка конструкторов — Объясните конструкторы Queue
Здравствуйте! Объясните пожалуйста конструкторы Queue(Queue ob) и Queue(char a). Буду премного.Написать класс Queue (очередь), который умеет хранить следующие данные
Добрый вечер дорогие программисты) Не давно на вашем форуму, очень многое и интересное узнал у Вас.Конвертация массива int, long, boolean, String, double, в List, Set, Queue, Deque
С конвертацией простых типов и строк ничего сложного. Вот код public class Main < .Какой из методов меняет очередь
Lyokha Blagodatskikh Уровень 48
29 июня 2022
Это что за секретная лекция? у меня пройден весь Java Syntax, почему эта лекция для меня закрыта и нет возможности открыть?
Pixta Уровень 108 Expert
21 января 2022
Александр Огарков Уровень 108 Expert
6 января 2022
Неплохая статья — Коротко о главном — Java Collections Framework. Будьте осторожны, внутри много дополнительных ссылок, можно выпасть из жизни на пол дня. Ниже спойлер, не читай, если ещё не решал задачи ↓ Решил task1327, когда ещё не было ни условия ни лекции к задаче, а только требования: • В месте инициализации поля queue нужно заменить LinkedList на другой класс. • Нельзя изменять метод main. • Метод main должен напечатать буквы в алфавитном порядке. Ну значит я такой создал свой класс-наследник от LinkedList и переопределил метод addAll , где отсортировал коллекцию. Ну логично же, думал я, пока не посмотрел правильное решение с PriorityQueue ♂️ Хотя, если подумать, в этом что-то есть. Т.е. если в будущем вам в лекции расскажут про класс PriorityQueue, а потом дадут задачу с условием (заменить LinkedList на другой класс), это будет совсем уныло и не интересно) лан, Валидатор принял и мой MyList , идём дальше.