Коллекции Java. Легкое прикосновение

Тема коллекций в Java настолько обширна и многогранна, что в рамках одной статьи описать их работу проблематично и неэффективно. Поэтому сегодня мы сделаем легкое прикосновение к теме коллекций в Java. Если говорить конкретно, то мы коснемся следующих тем:

  • Java Collection Framework (JCF)
  • Collection and Iterable
  • List
  • Set
  • Map

Java Collection Framework (JCF)

Для чего вообще нужны коллекции? Очевидно, что для работы с группой неких связанных данных. Вы скажете: зачем нам нужны коллекции, если есть массивы? Да, такая структура данных как массив вполне позволяет работать с такими данными, но при этом имеет ряд ограничений. В частности массивы имеют фиксированный размер, и примитивный API для работы с данными. Эти минусы с лихвой покрывают собой коллекции, изменяющие размер и имеющие обширный API. Однако, у коллекций есть недостаток, если можно так сказать. Мы не можем хранить в коллекции примитивы в отличии от массивов. Когда массивов становится недостаточно, мы можем использовать следующие структуры данных из JCF: List, Set  и Map. Коснемся их чуть позже. Java Collection Framework были добавлены в java 1.2, серьезно обновлены в java 5, в связи с добавление Generics, в java 8 был добавлен Stream API для работы с коллекциями, в java 9 для коллекций стал доступен фабричный метод. Резюмируя, можно отметить преимущества, которые вы получите при использовании коллекций: сокращение усилий на написание кода, увеличение производительности, обеспечение взаимодействия между несвязанными API, снижение затрат на разработку собственных API.

Collection и Iterator.

Collection –   интерфейс, который реализуют основные коллекции.

Как мы видим, интерфейс Collection расширяет Iterable. Поэтому для каждой коллекции доступен Iterator с помощью которого можно передвигаться последовательно по коллекции. В свою очередь Collection расширяют интерфейсы List, Set и Queue.

  • List – интерфейс для различных списков.
  • Set – интерфейс для множеств. Главное отличие от List – не хранит дубликаты, каждый элемент Set уникальный. Имеет расширения SortedSet – упорядоченное множество, и NavigableSet – тоже упорядоченное множество с добавлением новых элементов для быстрой навигации.
  • Queue – интерфейс для реализации такой структуры данных как очередь (принцип FIFO). Его расширяют Deque – очередь, позволяющая получать элементы с двух сторон. BlockingQueue и BlockingDeque из пакета java.util.concurrent – расширения для многопоточного программирования. Вообще стоит отметить, что очереди отлично подходят для многопоточной модели, построенной по шаблону Produce – Consumer.

Обратите особое внимание на то, что Map не является Collection, и поэтому для “мапы” нельзя использовать итератор. У Map так же есть интерфейсы, расширяющие его:

  • SortedMap и NavigableMap работают схоже с  Set.
  • ConcurrentMap и ConcurrentNavigableMap – многопоточные разширения.

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

List.

Основными отличительными особенностями списков являются: сохранение элементов в порядке их добавления в список, возможность получить элемент по его индексу, индексы начинаются с 0, имеет много реализаций, самыми популярными из которых являются ArrayList и LinkedList (для многопоточного программирования так же существует потокобезопасная реализация CopyOnWriteArrayList). Говорить про реализации в этой статье мы не будем, не забываем что наша основная цель лишь прикоснуться. Оставим их подробное описание для других статей.

Set.

Как было сказано выше, множества не содержат дубликатов. Так же не имеют порядка и при добавление элемента, уже присутствующего в множестве никакого эффекта не произойдет. Правда тонкостью здесь будет то, что метод add() для множеств возвращает значение true – если элемент добавлен и false – если нет по причине его присутствия в множестве. Сравнение элементов в Set происходит с помощью equals().

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

Map.

Структура данных представляет собой пару ключ-значение. Причем ключ должен быть уникальным. Можно даже сказать с натяжкой, что ключи – это множество.

Как вы понимаете, реализации Map – тема отдельной … нет отдельнЫХ статей.

Оставить комментарий:

Ваш email не будет опубликован.