Обзор коллекций в Java
В процессе создания любого программного обеспечения рано или поздно возникает необходимость в хранении набора определенных объектов. Сюда можно отнести строки, числа, объекты, принадлежащие к категории пользовательских классов и прочее. Поэтому есть необходимость разобраться во всех базовых классах коллекций посредством применения обычного языка.
Что собой представляют java коллекции?
Практически в каждой программе, которая создана на языке java, используются коллекции. Поэтому очень важно сделать все для того, чтобы процесс их применения был максимально эффективным.
Сами по себе коллекции java представляют собой группы элементов, контейнеры, которые визуально выглядят в виде единого целого. Сюда можно отнести такой пример, как список имен, банка конфет и прочие варианты. Стоит обратить внимание на то, что использование коллекций не ограничивается одним языком java, так как они применяются и в процессе создания программ на других языках.
Первоначально, как только коллекции начали использовать в java, их выделяли всего лишь несколько активных классов. Но ныне существует полноценный список java коллекций, с которыми стоит ознакомиться более детально.
Составляющие элементы java коллекций
Если рассматривать коллекции java, то конструктивно они состоят из определенных частей.
Интерфейс – за счет интерфейсов, имеющихся в составе коллекций, есть возможность обеспечить тип данных абстрактного вида для того, чтобы представить корневой интерфейс фреймворка. Именно он располагается на самой вершине в иерархии составляющих элементов коллекций. В его состав входят наиболее важные методы, используемые в процессе написания программ:
- clear,
- remove,
- add,
- iterator,
- size.
Эти методы в нормальных условиях должны быть реализованы каждой из коллекций. Помимо этого, интерфейса существует множество других, которые располагаются в специальном пакете под назначение java.util.
Реализация – для коллекций в java представляется огромное количество реализаций. При этом их можно применять для такого процесса, как создание новых классов коллекций. Посредством применения множества базовых коллекций есть возможность осуществить процесс решения огромного количества задач, но в том случае, если для коллекции нужна какая-то особая реализация, то здесь ее можно создать самостоятельно.
Стоит обратить внимание на то, что в java5 используются потокобезопасные коллекции, что дает возможность вносить изменения в их структуру по элементам в тот момент, когда происходит иттерация.
Алгоритмы – они принадлежат к категории полезных методов, посредством применения которых можно решить множество достаточно простых задач, среди которых стоит обратить внимание на перетасовку, сортировку, поиск и прочие элементарные действия.
Достоинства java коллекций
Рассматривая java коллекции, стоит обратить внимание на то, что они имеют достаточно большое количество преимуществ. Среди них основными являются следующие:
- необходимость в использовании небольшого количества усилий – в состав фрейморка входит достаточно большое количество методов, используемых для манипуляции данными и разных типов коллекций. Это дает возможность сконцентрировать внимание не на разработке, а непосредственно на бизнес-логике;
- высокие показатели качества – качество программы зависит от того, насколько хорошо проверенные коллекции используются для реализации этого процесса;
- отличная совместимость и возможность повторного применения.
Коллекции java и ее интерфейсы
В основе java коллекций находятся интерфейсы. Независимо от того, с каким из них придется иметь дело, каждый принадлежит к категории Generic. Например, можно обратить внимание на publicinterface Collection<E>. Здесь символ <E> указывает на тип применяемого объекта, который может находиться в определенной коллекции. В дальнейшем это позволяет уменьшить количество времени, которое необходимо для поиска ошибок в процессе проверки используемых типов объектов на этапе компиляции программы.
Важно обратить внимание на то, что со стороны платформы java для каждого типа коллекций не предоставляются отдельные интерфейсы. В том случае, если реализовать какую-то из операций не удается, перед программистом возникает уведомление UnsupportedOperationException.
Iterator и его интерфейс
В состав итератора входят все необходимые методы, посредством применения которых есть возможность выполнить процесс перебора всех элементов, которые входят в структуру определенной коллекции. Посредством применения метода iterator есть возможность получить экземпляр итератора, полученного из определенной коллекции. В процессе выполнения базовых итераций есть возможность удалить непосредственно из базовой коллекции отдельные элементы при использовании этого метода.
Set и его интерфейс
Рассматривая этот набор, он представляет собой коллекцию, в состав которой не могут быть включены те элементы, которые могут повторяться. Визуально этот интерфейс выглядит в виде некой математической абстракции, посредством использования которой можно представлять множества в виде колоды карт.
Для реализации Set на платформе java предусмотрено несколько реализаций — LinkedHashSet, TreeSet, HashSet и просто Set, которые не дают возможности получения прямого доступа к элементу, взятому из коллекции. Для того, чтобы выполнить перебор элементов коллекции, есть необходимость в применении цикла или же соответствующего итератора.
List и его интерфейс
Рассматривая такой важный элемент, как список, стоит обратить внимание на то, что он выглядит в виде упорядоченного набора элементов, среди которых могут находиться те, которые повторяются. В том случае, если есть необходимость в получении доступа к любому из элементов, можно реализовать этот процесс непосредственно по индексу. Сам же список в свою очередь выглядит в виде некого динамического массива.
Среди всех типов коллекций, представленных на платформе java, именно список принадлежит к категории наиболее используемых. В качестве реализации интерфейса List могут выступать LinkedList и ArrayList.
Если же есть необходимость в рассмотрении примера, где используется список, можно обратить внимание на образец, расположенный ниже:
Queue и его интерфейс
Для того, чтобы реализовать процесс хранения одновременно нескольких элементов, применяется такая коллекция, как Очередь. Если рассматривать то, каким образом здесь размещаются элементы, в большинстве случаев, но не обязательно, здесь используется так называемое правило FIFO. Оно указывает на то, что как только один элемент входит, другой должен сразу же выйти. Те элементы, которые попадают в очередь, они находятся в самом ее конце.
Dequeue и его интерфейс
Посредством применения представленной коллекции есть возможность реализовать процесс поддержки, удаления или вставки определенного элемента, как в конце, так и непосредственно в самом начале используемой коллекции. Если же рассматривать перевод наименования этой коллекции, то она именуется, как, «двухконцевая очередь». На число используемых элементов в этой коллекции не применяются никакие ограничения.
С помощью этого интерфейса можно реализовать процесс определения методов к доступу к тем элементам, которые располагаются непосредственно на концах дека. Такие методы можно использовать для извлечения, удаления или же вставки необходимых элементов.
Map и его интерфейс
Мар принадлежит к категории тех интерфейсов, в состав которых входят значения и ключи. Стоит обратить внимание на то, что в этом интерфейсе ни в коем случае не могут храниться дубликаты ключей. Для каждого из них должно четко определяться единственное значение. Для реализации интерфейса Мар на платформе предусмотрено такие реализации, как LinkedHashMap, TreeMap и HashMap.
ListIterator и его интерфейс
В том случае, если у программиста есть необходимость в прохождении списка любым удобным способом, здесь на помощь придет ListIterator. При этом здесь есть возможность вносить изменения в список непосредственно в процессе итерации, а также определять позицию, на которой в списке будет находиться определенный итератор.
SortedSet и его интерфейс
Этот интерфейс выглядит в виде множества, в котором процесс хранения элементом осуществляется в четко в той последовательности, по которой происходит их возрастание.
SortedMap и его интерфейс
Если рассматривать структуру SortedMap, то здесь элементы размещаются в том порядке, в котором происходит возрастание их ключей. По сути, это аналог интерфейса SortedSet. Представленный вариант вполне целесообразно применять в том случае, если нужно реализовать естественный процесс упорядочения значений и ключей, куда можно отнести телефонные справочники и словари.
Разновидности классов, помогающих реализовать коллекции java
Рассматривая коллекции java, стоит обратить внимание на то, что они представлены достаточно большим списком классов, в которых можно реализовать разнообразные интерфейсы используемых коллекций. Среди наиболее распространенных и востребованных стоит обратить внимание на следующие — HashSet, HashMap и ArrayList.
Стоит обратить внимание на то, что все классы, которые принадлежат к категории тех, которые реализуют коллекции, то они не являются потокобезопасными. Ознакомимся детальнее с теми вариантами классов, которые встречаются чаще всего.
HashSet – класс, который принадлежит к категории базовых реализаций интерфейса Set, базирующегося на HashMap. Посредством применения этого класса есть возможность задать одинаковое время, в которое будут выполняться ключевые операции. При этом, это идеальная возможность установить начальный коэффициент нагрузки, а также показатель емкости в самом начале.
TreeSet – в основе этого класса находится TreeMap. Процесс упорядочения элементов происходит за счет работы компаратора или же в том порядке, в котором происходит их добавление. С помощью представленной реализации можно обеспечить процесс выполнения таких базовых операций, как contains, remove, add.
ArrayList – класс, который предоставляет возможность выполнить реализацию в виде массива с переменными показателями длины. С его помощью можно выполнить абсолютно все действия, касающиеся списка. Помимо этого, представленный класс дает возможность обеспечить те методы, посредством применения которых можно выполнять процесс манипуляции размерами массива, в котором происходит процесс хранения списка. Если рассматривать примерное сопоставление, то этот класс соответствует направлению вектора.
LinkedList – класс, посредством использования которого можно представить в виде двусвязного списка интерфейсы Deque и List. Посредством его использования можно обеспечить процесс выполнения всех операций со списком, которые принадлежат к категории дополнительных.
HashMap – класс, выступающий в виде реализации такого интерфейса, как Мар. Помимо этого, посредством использования этого класса к использованию допускаются нулевые значения, а также можно выполнить дополнительные операции, которые необходимы для Мар. Стоит обратить внимание на то, что этот класс не принадлежит к категории не синхронизированных. За то, что все элементы в массиве будут упорядочены, этот класс не отвечает.
TreeМар – это класс, который визуально выглядит в виде черно-красного дерева, реализация которого выполнена на основе NavigableMap. Процесс сортировки здесь происходит посредством применения компаратора.
PriorityQueue – класс, который обеспечивает процесс добавления элементов в порядке их приоритетности. Реализуется этот процесс, как и в предыдущем варианте, посредством применения компаратора. Стоит обратить внимание на то, что этот класс не дает возможности осуществлять такой процесс, как хранение нулевых значений.
Collections – в состав представленного класса включены только статические методы, которые обеспечивают возврат или же вовсе работу коллекции. В состав такого класса входят алгоритмы полиморфного вида, которые активно применяются в процессе работы с разными видами коллекций. В этот класс также входят такие методы, как сортировка, бинарный поиск, возвращение обратного порядка и перемешивание.
Работа с синхронизированными оболочками
В том случае, если есть необходимость в реализации автоматической синхронизации, необходимой для определенной коллекции, нужно использовать так называемые синхронизированные оболочки. Если же рассматривать шесть ключевых интерфейсов применяемых коллекций, то для каждого из них можно применять фабричный статический метод синхронизации. Здесь стоит обратить внимание на те методы, которые перечислены ниже:
Посредством применения каждого из вышеперечисленных методов есть возможность возвратить потокобезопасную (синхронизированную) коллекцию.
Работа с неизменяемыми оболочками
Посредством использования неизменяемых оболочек нет возможности в реализации такого процесса, как изменение коллекции за счет перехвата тех операций, которые помогли бы выполнить этот процесс. Среди таких методов выделяют следующие:
Очень часто от программистов, занимающихся процессом разработки программного обеспечения можно услышать вопрос о том, какой из коллекций стоит отдать предпочтение, так как их список является достаточно широким. Ниже можно ознакомиться с таблицей, в которой приведены самые важные характеристики, которыми обладает каждая из рассмотренных коллекций:
Ориентируясь на вышеперечисленные данные, каждый из программистов в будущем может выполнить правильный выбор, который приведет к получению желаемого результата.