Вам бонус- начислено 1 монета за дневную активность. Сейчас у вас 1 монета

Коллекция и контейнер в программировании. Пример коллекций на Java

Лекция



Привет, Вы узнаете о том , что такое коллекции, Разберем основные их виды и особенности использования. Еще будет много подробных примеров и описаний. Для того чтобы лучше понимать что такое коллекции, контейнер в программировании, коллекции java , настоятельно рекомендую прочитать все из категории Структуры данных.

Коллекция в программировании — программный объект, содержащий в себе, тем или иным образом, набор значений одного или различных типов, и позволяющий обращаться к этим значениям.

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

Коллекции и контейнеры

Коллекция или контейнер группирует некоторое переменное (возможно, нулевое) число элементов данных, которые имеют некоторое общее значение для решения проблемы. Над ними проводятся операции некоторым способом. Обычно элементы данных имеют один и тот же тип или, в языках, поддерживающих наследование, типы будут получены из некоторого общего типа-предка. Коллекция — понятие, применимое к абстрактным типам данных, и не предписывает определенную реализацию через конкретную структуру данных, хотя часто существует устоявшийся выбор. Контейнеры в теории типов — абстракции, которые разрешают коллекциям различных структур, таких как списки и деревья, быть представленными некоторым однородным способом. (Унарный) контейнер определен индексами S и семейством типов на позициях P, индексируемыми через S: задана функция от типов индексов к типу элементов. Контейнеры можно рассматривать как канонические классы для коллекций различных типов. Списки индексируются через натуральные числа (включая ноль). Для списков определен максимальный индекс. Натуральные числа как индексы изоморфны спискам. Для деревьев структура дерева может быть выражена через индексы без конкретной информации о содержимом узлов. Индексы элементов структуры в памяти изоморфны путям от корня дерева до его узлов.

Классификация

По общим характеристикам

  • Коллекция может иметь постоянный либо динамически изменяющийся размер. В первом случае в коллекцию может быть записано только строго определенное количество объектов, во втором — коллекция допускает размещение стольких объектов, сколько необходимо (разумеется, в пределах, задаваемых техническими ограничениями). В большинстве случаев, говоря о коллекции, имеют в виду динамическую коллекцию, то есть коллекцию второго вида, хотя, например, обычный статический массив — это тоже коллекция.
  • Коллекция может хранить объекты только одного или различных типов. Во втором случае говорят о гетерогенной коллекции.

По логике организации

В зависимости от того, как логически организован доступ к данным коллекции, выделяются следующие основные типы:

  • Вектор — элементы коллекции упорядочены, каждый имеет собственный номер, называемый индексом, по которому к нему можно в любой момент обратиться. Как правило, в качестве индексов выступают последовательные целые числа либо значения, приводимые к ним. Для обращения к элементу вектора используется имя вектора и значение индекса. При добавлении нового элемента он добавляется либо в конец вектора, либо в позицию с заданным индексом. Удаление элемента из вектора приводит к образованию пустого элемента.
  • Матрица — элементы имеют два упорядоченных индекса, каждый из которых является целым числом или значением, приводимым к целому. Для доступа к элементу нужно указать имя матрицы и оба индекса. Новый элемент может быть добавлен только в позицию с заданной парой индексов. Удаление приводит к оставлению пустого элемента.
  • Многомерный массив — логическое развитие идеи вектора и матрицы до большего (в общем случае — произвольного) числа индексов.
  • Список — элементы коллекции упорядочены, идентификаторов у элементов нет. Список — коллекция с последовательным доступом. В любой момент доступен первый элемент коллекции (обычно также доступен и последний). От любого элемента коллекции можно получить доступ к следующему по порядку, таким образом, можно последовательно дойти от первого элемента списка до любого желаемого. Возможна реализация, допускающая обратный проход (к предыдущему элементу от известного). Новый элемент может добавляться в начало или в конец списка. При удалении элемента из начала списка первым элементом становится следующий за ним, при удалении из конца — предыдущий, из середины — предыдущий и последующий элементы становятся, соответственно, предыдущим и последующим один для другого.
  • Стек — коллекция, реализующая принцип хранения «LIFO» («последним пришел — первым вышел»). В стеке постоянно доступен только один элемент — тот, который был добавлен последним. Новый элемент может быть добавлен в стек, он станет текущим. Текущий элемент всегда можно удалить («взять») из стека, после этого становится доступен элемент, который был добавлен непосредственно перед ним.
  • Очередь — коллекция, реализующая принцип хранения «FIFO» («первым пришел — первым вышел»). В очереди постоянно доступен только один элемент — тот, который был добавлен самым первым из имеющихся. При добавлении нового элемента он попадает в очередь. Текущий элемент можно удалить — тогда текущим станет элемент, добавленный первым из оставшихся.
  • Ассоциативный массив (словарь) — неупорядоченная коллекция, хранящая пары «ключ — значение». Доступ к элементам производится по ключу. В качестве ключа могут использоваться значения различных типов, единственное ограничение — тип ключа должен допускать сравнение на равенство. Любая пара может быть в любой момент удалена. Добавляться может только пара (с определенным ключом). Может вводиться запрет на дублирование ключей в коллекции. Если такого ограничения нет, то при обращении по дублирующемуся ключу может выдаваться либо n-е найденное значение (где n либо постоянно, либо определяется формой запроса), либо все значения с данным ключом.
  • Множество — неупорядоченная коллекция, хранящая набор уникальных значений и поддерживающая для них операции добавления, удаления и определения вхождения. Как правило, для множеств поддерживаются операции, аналогичные операциям с математическими множествами: объединение, пересечение,симметричная разность множеств и несимметричная разность множеств.
  • Мультимножество — неупорядоченная коллекция, аналогичная множеству, но допускающая наличие в коллекции одновременно двух и более одинаковых значений.

По реализации

На уровне реализации коллекция может представлять собой одну из следующих структур данных:

  • Массив
  • Односвязный список
  • Двусвязный список
  • Стек
  • Хеш-таблица
  • Битовый массив

Операции над коллекциями

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

  • Для всех видов коллекций — объединение. Результатом такой операции становится коллекция того же типа, что и операнды, содержащая все элементы, содержащиеся в операндах.
  • Для векторов и матриц, содержащих числовые значения — типичные математические операции над одноименными объектами: сложение, вычитание, умножение, транспонирование.
  • Для векторов — извлечения диапазона индексов. Результатом такой операции будет вектор того же типа, содержащий только те элементы исходного, которые попадают в некоторый заданный диапазон.
  • Для векторов и списков — сортировка.
  • Для множеств — объединение, пересечение, разность и симметричная разность.

Типы Контенеров

Контейнеры можно разделить на однозначные или ассоциативные контейнеры .

Однозначные контейнеры хранят каждый объект независимо. Доступ к объектам можно получить напрямую или с помощью итератора .

Ассоциативный контейнер использует ассоциативный массив , карту или словарь, состоящий из пар ключ-значение, так что каждый ключ появляется в контейнере не более одного раза. Ключ используется для поиска значения, объекта, если он хранится в контейнере. Ассоциативные контейнеры используются в языках программирования как шаблоны классов.

К абстрактным типам данных контейнера относятся:

  • Очереди FIFO
  • LIFO стеки
  • Приоритетные очереди
  • Таблицы поиска (LUT)
  • Связанные с ключами структуры данных
    • Наборы , содержащие и индексирующие объекты по значению или по определенному свойству;
    • Карты , связывающие с каждым ключом "значение" для поиска

Общие структуры данных, используемые для реализации этих абстрактных типов, включают:

  • Массивы и их производные
  • Связанные списки
  • Деревья двоичного поиска (BST), особенно самобалансирующиеся BST
  • Хеш-таблицы

Графические контейнеры

Наборы инструментов для виджетов также используют контейнеры, которые представляют собой специальные виджеты для группировки других виджетов, таких как окна , панели . Об этом говорит сайт https://intellect.icu . Помимо своих графических свойств, они имеют тот же тип поведения, что и классы контейнеров, поскольку они хранят список своих дочерних виджетов и позволяют добавлять, удалять или извлекать виджеты среди своих дочерних элементов .

Коллекций в Java (Java Collections Framework)

Java Коллекции являются одним из столпов Java Core. Они используются почти в каждом приложении, поэтому мы просто обязаны уметь использовать Java Collections Framework эффективно.

Что такое Коллекции?

Коллекции — это контейнеры, группы элементов, которые представляют собой единое целое.

Например: банка конфет, список имен и т.д. Коллекции используются почти в каждом языке программирования и Java не является исключением. Как только коллекции появились в Java, то насчитывали всего несколько классов: Vector, Stack, Hashtable, Array. Но уже в Java 1.2 появился полноценный Java Collections Framework, с которым мы и будем сегодня знакомиться.

Коллекции в Java состоят нескольких частей

  • Интерфейсы: В коллекциях интерфейсы обеспечивают абстрактный тип данных для представления коллекции java.util.Collection — корневого интерфейса фреймворка. Он находится на вершине иерархии Коллекций. Он содержит наиболее важные методы: size(), iterator(), add(), remove(), clear(). Каждая коллекция должна реализовывать эти методы. Также есть другие важные интерфейсы java.util.List,java.util.Set,java.util.Queue и java.util.Map. Map является единственным интерфейсом, который не наследует интерфейс Collection, но является неотъемлемой частью коллекций. Все интерфейсы фреймворка находятся в пакете java.util.
  • Реализация: Java предоставляет готовые классы с реализацией вышеупомянутых коллекций. Мы можем использовать их для создания новых типов коллекций в нашей программе. С помощью классов ArrayList, LinkedList, HashMap, TreeMap, HashSet, TreeSet можно решить огромное количество задач, но если нам нужна специальная реализация той или иной коллекции, мы можем наследовать ее и работать со своей реализацией. В Java 1.5 придумали потокобезопасные коллекции, которые позволили изменять содержимое коллекции время итерации по элементам. Наиболее популярными являются: CopyOnWriteArrayList, ConcurrentHashMap,CopyOnWriteArraySet. Эти классы находятся в пакете java.util.concurrent. Все классы коллекций находятся в пакетах java.util и java.util.concurrent.
  • Алгоритмы: алгоритмы — это полезны методы, которые решают тривиальные задачи, например: поиск, сортировка и перетасовка элементов коллекции.
  • Ниже на диаграмме классов показана иерархия Java Collections Framework. Для простоты я включил только часто используемые интерфейсы и классы.

Коллекция и контейнер в программировании. Пример коллекций на Java

Преимущества Java Collections Framework

В Java Collections Framework есть следующие преимущества:

  • Требует меньше усилий. Фреймворк располагает множеством распространенных типов коллекций и полезных методов для манипуляции данными. Таким образом, мы можем сосредоточиться на бизнес-логике, а не разработке наших API.
  • Отличное качество — использование хорошо проверенных коллекций увеличивает качество нашей программы.
  • Повторное использование и совместимость

Интерфейсы коллекций

Интерфейсы являются основой Java Collections Framework. Обратите внимание, что все интерфейсы являются Generic, например public interface Collection. Использование — это указание типа объекта, который коллекция может содержать. Это помогает сократить ошибки времени выполнения с помощью проверки типов объектов во время компиляции.

Следует отметить, что платформа Java не предоставляет отдельные интерфейсы для каждого типа коллекций. Если какая-то операция не поддерживается, то реализация коллекции бросает UnsupportedOperationException.

Кратко по каждой коллекции

Интерфейс итератора (Iterator)

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

Интерфейс множества (Set)

Набор представляет собой коллекцию, которая не может содержать повторяющиеся элементы. Этот интерфейс представляет математическую абстракцию для представления множеств в виде колоды карт.

Платформа Java содержит три реализации Set : HashSet, TreeSet и LinkedHashSet.ИнтерфейсSet не позволяет осуществлять произвольный доступ к элементу в коллекции. Мы можем использовать итератор или цикл по каждому элементу для перебора элементов.

Интерфейс Список (List)

Список представляет собой упорядоченный набор элементов и может содержать повторяющиеся элементы. Вы можете получить доступ к любому элементу по индексу. Список представляет собой динамический массив. Список является одним из наиболее используемых типов коллекций. ArrayList и LinkedList классы являются реализацией интерфейса List.

Вот небольшой пример использования:

Интерфейс Очередь (Queue)

Очередь — коллекция, которая используется для хранения нескольких элементов.

В очереди обычно, но не обязательно, элементы располагаются по принципу FIFO (first-in,first-out = первый вошел, первый вышел). В очереди FIFO, все новые элементы вставляются в конец очереди.

Интерфейс Dequeue

Коллекция Dequeue поддерживает вставку элемента и удаление элемента как в начало, так и в конец коллекции. Название Deque это сокращение от «двухконцевой очереди» и, как правило, произносится как «deck». Большинство реализаций DEQUE не устанавливают ограничения на количество элементов.

Этот интерфейс определяет методы для доступа к элементам на концах дека. Методы предоставляются для вставки, удаления, извлечения элемента.

Интерфейс Map

Map является объектом, который содержит ключи и значения. Map не может содержать дубли ключей: Каждый ключ может иметь только одно значение.

Платформа Java содержит три реализации Map: HashMap, TreeMap и LinkedHashMap.

Интерфейс ListIterator

ListIterator (итератор для списков) позволяет программисту проходить список в любом направлении, изменять список во итерации, и получать текущую позицию итератора в списке.

Интерфейс SortedSet

SortedSet представляет собой множество, в котором элементы хранятся в порядке возрастания.

Интерфейс SortedMap

SortedMap содержит элементы в порядке возрастания ключей. Эта Map является аналогом SortedSet. SortedMap используются для естественно упорядоченных пар ключ/значение, например, словарей и телефонных справочников.

Классы реализующие Java коллекции

Java Collections framework предоставляет большое количество классов с реализацией интерфейсов коллекций. Наиболее используемыми и распространенными реализациями являются ArrayList, HashMap и HashSet. Обычно классы, реализующие коллекции, не являются потокобезопасными.

Далее в этой статье мы разберем наиболее используемые классы в Java Collections framework.

HashSet Класс

Это базовая реализация интерфейса Set, которая базируется на HashMap.

Этот класс предлагает одинаковое время выполнения базовых операций (add, remove,contains и size). Мы можем установить начальную емкость и коэффициент нагрузки для этой коллекции.

Класс TreeSet

NavigableSet создан на основе TreeMap. Элементы могут быть упорядочены в порядке их добавления или с помощью компаратора.

Эта реализация обеспечивает log(n) время выполнения для основных операций (add, removeи contains).

Класс ArrayList

ArrayList — реализация интерфейса List в виде массива переменной длины. Реализует все операции со списком. Плюс к этому ArrayList обеспечивает методы для манипулирования размером массива, который используется для хранения списка. (Этот класс примерно соответствует вектору, но не является synchronized).

LinkedList класс

LinkedList — реализация интерфейсов List и Deque в виде двусвязного списка. Осуществляет все дополнительные операции со списком.

Класс HashMap

HashMap представляет собой реализацию интерфейса Map. Эта реализация обеспечивает все дополнительные операции Map и позволяет нулевые значения и ключи со значением null. Класс HashMap примерно эквивалентно Hashtable, кроме того, что он не синхронизирован и позволяет null. Этот класс не дает никаких гарантий упорядоченного размещения элементов.

Класс TreeMap

TreeMap представляет собой красно-черное дерево, основанное на NavigableMap. Map сортируются с помощью компаратора.

Эта реализация обеспечивает log(n) время выполнения для операций containsKey, get, putи remove .

Класс PriorityQueue

В очереди элементы додаются в порядке FIFO, но иногда мы хотим добавлять элементы на основании их приоритета. В этом случае мы можем использовать PriorityQueue, обеспечив при этом реализацию компаратора для элементов PriorityQueue. Следует отметить, что PriorityQueue не позволяют хранить null

Класс Collections

Этот класс состоит исключительно из статических методов, которые работают или возвращают коллекции. Он содержит полиморфные алгоритмы, которые используются при работе с коллекциями.

Этот класс содержит методы основных алгоритмов Сollection framework, а именно методы бинарного поиска, сортировка, перемешивание, а также метод, возвращающий обратный порядок элементов и многие другие.

Синхронизированные оболочки

Синхронизированные оболочки добавляют автоматическую синхронизацию (потоко-безопасность) к определенной коллекции. Каждый из шести основных интерфейсов коллекций (Collection, Set, List, Map, SortedSet, и SortedMap) располагает статическим фабричным методом синхронизации.

Каждый из этих методов возвращает синхронизированную (потокобезопасную) коллекцию.

Неизменяемые оболочки

Неизменяемые оболочки/обертки не позволяют изменять коллекцию, перехватывая все операции, которые изменяют коллекции и бросают UnsupportedOperationException в том случае, если кто-то захочет это сделать. Вот эти методы:

Какую же коллекцию выбрать?

Этим вопросом часто задаются программисты выбирая между множеством коллекций, представленных в Java Collections Framework. Ниже представлена таблица, в которой собраны все наиболее значимые характеристики коллекций:

Коллекция Упорядо

чивание

Random Access Ключ-значение Дубликат Элементы Нулевой элемент Потоко

безопасность

ArrayList Да Да Нет Да Да Нет
LinkedList Да Нет Нет Да Да Нет
HashSet Нет Нет Нет Нет Да Нет
TreeSet Да Нет Нет Нет Нет Нет
HashMap Нет Да Да Нет Да Нет
TreeMap Да Да Да Нет Нет Нет
Vector Да Да Нет Да Да Да
Hashtable Нет Да Да Нет Нет Да
Properties Нет Да Да Нет Нет Да
Stack Да Нет Нет Да Да Да
CopyOnWriteArrayList Да Да Нет Да Да Да
ConcurrentHashMap Нет Да Да Нет Нет Да
CopyOnWriteArraySet Нет Нет Нет Нет Да Да

В этом обзоре мы узнали основные компоненты Java Collections Framework. В следующих статьях мы разберем популярные коллекции и научимся использовать каждую коллекцию по назначению.

Вау!! 😲 Ты еще не читал? Это зря!

Выводы из данной статьи про коллекции указывают на необходимость использования современных методов для оптимизации любых систем. Надеюсь, что теперь ты понял что такое коллекции, контейнер в программировании, коллекции java и для чего все это нужно, а если не понял, или есть замечания, то не стесняйся, пиши или спрашивай в комментариях, с удовольствием отвечу. Для того чтобы глубже понять настоятельно рекомендую изучить всю информацию из категории Структуры данных

создано: 2016-08-24
обновлено: 2024-11-14
488



Рейтиг 9 of 10. count vote: 2
Вы довольны ?:


Поделиться:

Найди готовое или заработай

С нашими удобными сервисами без комиссии*

Как это работает? | Узнать цену?

Найти исполнителя
$0 / весь год.
  • У вас есть задание, но нет времени его делать
  • Вы хотите найти профессионала для выплнения задания
  • Возможно примерение функции гаранта на сделку
  • Приорететная поддержка
  • идеально подходит для студентов, у которых нет времени для решения заданий
Готовое решение
$0 / весь год.
  • Вы можите продать(исполнителем) или купить(заказчиком) готовое решение
  • Вам предоставят готовое решение
  • Будет предоставлено в минимальные сроки т.к. задание уже готовое
  • Вы получите базовую гарантию 8 дней
  • Вы можете заработать на материалах
  • подходит как для студентов так и для преподавателей
Я исполнитель
$0 / весь год.
  • Вы профессионал своего дела
  • У вас есть опыт и желание зарабатывать
  • Вы хотите помочь в решении задач или написании работ
  • Возможно примерение функции гаранта на сделку
  • подходит для опытных студентов так и для преподавателей

Комментарии


Оставить комментарий
Если у вас есть какое-либо предложение, идея, благодарность или комментарий, не стесняйтесь писать. Мы очень ценим отзывы и рады услышать ваше мнение.
To reply

Структуры данных

Термины: Структуры данных