В программировании коллекциями называют наборы данных с определёнными свойствами.
Что считается набором данных? Допустим, у нас есть одна переменная:
a = 5
И вторая переменная:
b = 10
Каждая из них – это отдельная сущность, с которой можно работать напрямую, обращаясь по имени.
Если две эти переменные как-нибудь логически объединить (например, расположить в памяти друг за другом), и назначить этому объединению отдельное имя (назовём его collection), то мы получим уже набор данных. Этот набор будет состоять из двух элементов, которые по-прежнему являются отдельными переменными, но теперь мы не можем обратиться к ним напрямую. Мы можем обратиться только к collection, а элементы спрятаны внутри набора.
Не каждый набор данных является коллекцией
Коллекцией он становится тогда, когда предоставляет пользователю стандартный интерфейс для доступа к своим элементам. В этом интерфейсе могут быть такие методы, как:
- посчитать количество элементов
- перебрать элементы по очереди
- добавить элемент
- удалить элемент
и т.п. Но это мы обсудим потом. Сейчас рассмотрим самый базовый интерфейс – массив.
Чтобы получить доступ к первому элементу массива, пишем:
collection[0]
Чтобы получить доступ ко второму элементу, пишем:
collection[1]
Мы обращаемся к набору данных collection, используя интерфейс массива – квадратные скобки. В скобках указано, по какому смещению от начала структуры находится элемент. Первый элемент имеет смещение 0, так как он никуда не смещён от начала. Второй элемент имеет смещение 1, так как смещён на 1 позицию от начала.
Как видим, переменные a и b в такой структуре потеряли свои имена, и обращаться к ним можно только через смещения 0 и 1.
Классический массив имеет ограничения
- Он представляет собой одну непрерывную область памяти фиксированной длины
- Доступ к элементам происходит через смещения относительно начала массива
- Все элементы массива должны иметь одинаковый размер в байтах. Иначе не получится правильно вычислить смещения.
Например, мы хотим хранить в массиве 10 переменных размером 2 байта каждая. Значит,
- Массив занимает непрерывную область памяти размером 10 * 2 = 20 байт
- Доступ к элементам массива происходит так: смещение умножается на размер элемента, то есть на 2.
- collection[0] – это обращение к первому элементу
- collection[1] – это обращение ко второму элементу, который имеет смещение 1. Так как размер одного элемента 2 байта, то реальное смещение в памяти это 1*2 = 2.
В квадратных скобках мы всегда указываем смещение в элементах, а не в байтах, поэтому нас не волнует, какой размер у элемента. Но чтобы правильно вычислять истинные смещения в памяти, транслятор языка программирования должен знать, какой размер элементов (то есть, какой тип данных) используется у каждого конкретного массива.
Отсюда также следует, что смещения массива должны быть непрерывны: нельзя иметь элементы [0], [1], [3] и не иметь элемент [2] – тогда бы нарушилось вычисление смещений.
В массив также нельзя добавлять и удалять элементы (чтобы не менять размер выделенной памяти).
Но массивы-коллекции, которые используются во многих языках, являются массивами лишь внешне. В них можно добавлять и удалять элементы, делать смещения с пропусками, хранить элементы разного размера и т.д. В общем-то всё, что там осталось от классических массивов – это интерфейс доступа к элементам через квадратные скобки.
Даже сами смещения могут быть не числовыми, а символьными:
collection['a'] = 5;
collection['b'] = 10;
Таким образом то, что мы называем массивом, превращается в совершенно другой тип коллекции. Об этих типах мы поговорим в следующих частях, а пока рассмотрим некоторые методы, которые можно использовать для коллекции, основанной на массиве:
- collection.length – длина массива
- collection.push(a) – поместить переменную a в конец массива, увеличив его длину
- a = colleсtion.pop() – удалить последний элемент из массива (сократив его длину) и поместить этот элемент в переменную a
Методы push() и pop() работают по принципу стека.
Про конкретные методы, доступные для коллекции-массива, читайте в документации к языку, который изучаете. Не бойтесь делать это самостоятельно, без обучающих курсов. Помните, что коллекции – это универсальное понятие для всех языков. Допустим, я изучаю Python. Делаю поиск в гугле: Python массивы. И нахожу:
- len(array) – длина массива
- array.append(х) – добавление элемента в конец массива.
- array.pop(i) – удаляет i-й элемент из массива и возвращает его. По умолчанию удаляется последний элемент.
Эти методы отличаются от тех, что я написал выше (это был JavaScript), но по смыслу они делают то же самое. Вам не нужно зубрить, как что-то пишется в том или ином языке. Вам нужно просто знать, что там есть такие возможности. А конкретную реализацию всегда можно посмотреть в документации. Один раз посмотрев, дальше можете спокойно работать на этом языке.
Другие типы коллекций – и интереснее, и сложнее, чем обычные массивы. Читайте про них в следующих выпусках!
Подборка материалов про коллекции: