Ограниченное количество объектов с фиксированным временем жизни встречается разве что в самых простых программах. В основном ваши программы на Java будут создавать новые объекты, основываясь на таких критериях, которые станут известны лишь во время их работы. До того как программа начнет выполняться, вы обычно не знаете ни количества, ни даже типов нужных вам объектов. А для решения задач программирования в общем вам понадобится создавать неограниченное их число, когда угодно и где угодно. Нельзя рассчитывать, что для каждого из возможных объектов можно будет завести отдельную ссылку:
HyObject myReference;
Вы ведь не знаете заранее, сколько таких ссылок потребуется.
Большинство языков обеспечивают некоторые пути решения такой чрезвычайно насущной задачи. В Java имеется несколько способов хранения объектов (или, точнее, ссылок на объекты). На уровне компилятора поддерживаются массивы, которые уже рассматривались ранее. Массив обеспечивает самый эффективный способ хранения групп объектов и является первым кандидатом при хранении группы примитивов. Однако массив имеет фиксированный размер, а в общем случае во время написания программы разработчик может не знать точное количество объектов или же ему могут понадобиться более эффективные способы хранения объектов — в таких ситуациях ограничение фиксированного размера создает слишком много проблем.
Библиотека утилит Java (java.util.*
) также содержит достаточно полный набор классов контейнеров, важнейшими из которых являются List
, Set
, Queue
и Map
. Эти типы объектов также называются классами коллекций, но поскольку имя Collection используется для обозначения определенного подмножества библиотеки, я буду употреблять общий термин «контейнер». Контейнеры предоставляют весьма изощренные и разнообразные средства для хранения объектов и работы с ними, с помощью которых можно решить множество задач.
Классы контейнеров Java помимо прочих характеристик (например, Set
не содержит дубликатов, а Мар
представляет собой ассоциативный массив, который позволяет связывать объекты с другими объектами) способны автоматически изменяться в размерах.
Таким образом, в отличие от массивов, в класс можно поместить любое количество объектов, не беспокоясь о размере контейнера во время написания программы.
И хотя классы контейнеров не имеют прямой поддержки на уровне Java, это важнейший инструмент, который значительно повысит вашу квалификацию программиста. В последующих моих блогах вы получите практические навыки использования библиотеки контейнеров Java, причем особое внимание будет уделяться типичным примерам использования. Мы сосредоточимся на контейнерах, которые вы будете использовать в своей повседневной работе.