Collections Framework

Collections Framework

Дорогу осилит идущий

Первое знакомство с коллекциями

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

Для того, чтобы изучение этой темы было комфортным, убедитесь, что вы знакомы с:

  • Базовым синтаксисом Java;
  • Принципами ООП;
  • Основными структурами данных: массив, стек, очередь, дерево (рекомендую поверхностно ознакомиться самостоятельно, но разбор незнакомых структур будет параллельно с уроками, где они могут потребоваться);
  • Методы Object;
  • Generics;
  • Абстрактные классы и интерфейсы.

Итак, что же такое коллекция в терминах Java?

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

Стоит отметить, что любая коллекция представляет собой параметризованный тип.

Основные интерфейсы и реализации коллекций лежат в пакете java.util. В узком смысле именно эти классы и составляют Java Collections Framework. В широком смысле к Collections Framework относят всех наследников от основных интерфейсов коллекций (о них ниже).


Массивы и коллекции

Первая информация однозначно вызывает ассоциации с массивами. Постараемся понять, в чем заключаются основные отличия:

  • Коллекции работают на большем уровне абстракции. А значит берут на себя базовые операции расширения, наполнения, сортировки и поиска. Но при этом в основе ряда коллекций лежит массив;
  • Различные реализации коллекций имеют различные особенности и предназначены для конкретных манипуляций, что позволяет работать с данными более оптимально при выборе подходящей коллекции;
  • Коллекции имеют потокобезопасные реализации. Использование массива в многопоточной среде – риск получить непредсказуемое поведение;
  • В отличии от массива, коллекции не могут хранить примитивные типы – Generic’и не умеют работать с примитивами.


Иерархии коллекций

С точки зрения иерархии классов в рамках Collections Framework нас будут интересовать интерфейсы Iterable<T> (особенно его наследник Collection<T>) и Map<K, V>.

Рассмотрим иерархии этих интерфейсов, используя рисунок ниже (голубые – интерфейсы, зеленые - классы):

Что стоит отметить:

  • 3 наследника Collection – 3 разных типа коллекций: List, Queue, Set;
  • Map – не наследник Collection, но четвертый тип коллекций в Collection Framework;
  • Каждый тип имеет массу реализаций, на рисунке отмечены основные из них;
  • Map не является наследником Collection, потому что имеет иную параметризацию: он параметризуется двумя типами – K (key) и V(value). Остальные коллекции содержат в себе данные лишь одного типа.

Теперь обозначим характерные особенности каждого из типов коллекций. Помните, что конечные реализации могут расширять несколько интерфейсов. Например, LinkedList реализует как поведение списка (List), так и одного из наследников очереди (Queue).

Отличительные особенности разных типов коллекций:

  • List – доступ к элементам по индексу. Обычно элементы добавляют в конец списка и индекс присваивается в порядке добавления, но есть возможность вставки элемента с явным указанием его индекса;
  • Queue – реализует хранение элементов по принципу FIFO (first-in-first-out): первый вошел – первый вышел;
  • Set – характеризуется тем, что хранит лишь уникальные элементы (помните о необходимости переопределения equals() и hashcode() при использовании этого типа коллекций);
  • Map – позволяет хранить элементы в виде ассоциативного массива (пар «ключ-значение»). Т.е. мы всегда сможем получить доступ к объекту, если знаем его ключ. Ключи должны быть уникальны.

Возможно, сейчас вопросов все еще больше, чем ответов. Не стоит бояться, мы разберем каждый из типов подробно в рамках следующих уроков.


Классификация коллекций по потокобезопасности

Потокобезопасность – концепция, гарантирующая исправность и предсказуемость поведения кода в многопоточной среде. Намного подробнее этот термин будет разбираться в теме многопоточности.

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

  • Не потокобезопасные коллекции. Все основные реализации коллекций. В дальнейших уроках будут приведены примеры для каждого из типов;
  • Потокобезопасные коллекции (legacy). Коллекции из пакета java.util, гарантирующие потокобезопасность. Характерны тем, что крайне медленны из-за неоптимальной реализации потокобезопасности. Считаются устаревшими и не рекомендуются к использованию;
  • Потокобезопасные коллекции (java.util.concurrent). «Современные» потокобезопасные коллекции. Лежат в пакете java.util.concurrent. Реализованы более оптимально, чем legacy-коллекции, именно они используются, если предполагается, что код будет использоваться в многопоточном режиме.


Умение правильно выбирать коллекцию, исходя из потребностей, и использовать ее оптимально – крайне важный навык Java-разработчика. Для этого, в том числе, стоит представлять основы внутреннего устройства конкретных реализаций и учитывать, какие структуры данных лежат в основе той или иной коллекции.


На сегодня все!


Если что-то непонятно или не получается – welcome в комменты к посту или в лс:)

Канал: https://t.me/+relA0-qlUYAxZjI6

Мой тг: https://t.me/ironicMotherfucker

 

Дорогу осилит идущий!

Report Page