Когда мы все начинали программировать, лучшим способом хранения коллекции элементов был массив (уровень новичков).

Прежде чем говорить о том, почему массив - плохой выбор, давайте посмотрим, как он работает.

Хранилище одного типа данных

Массив - это коллекция одного и того же типа данных, потому что массиву необходимо обеспечить постоянное время доступа к элементам. Если бы мы могли хранить разные элементы, время доступа резко изменилось бы в зависимости от элементов. Вот почему в массиве хранятся данные одного и того же типа данных.

Распределение памяти

Он имеет непрерывное выделение памяти, присвоенное массиву, что означает, что когда мы создаем массив целочисленного типа и даем ему размер 10, произойдет то, что компилятор выделит нам 40 байт памяти.

Размер массива = размер типа данных * количество элементов;

int integerArray [] = новый int [10];

integerArray = 4 * 10;

Размер массива

Он имеет фиксированный размер, что означает, что заданный размер нельзя изменить, то есть нельзя сжимать, нельзя его расширять. Причина заключалась в том, что из-за непрерывного выделения памяти при создании массива, поэтому, когда мы меняем размер, мы не можем быть уверены (это не всегда возможно), что мы получим память нам. Сжатие не будет работать, потому что массив, когда он объявлен, получает память статически, и поэтому компилятор является единственным, кто его уничтожает.

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

Тогда вы могли бы создать переменную любого типа данных, возможно, она получит пространство памяти после массива.

Теперь, если вы попытаетесь расширить его (при условии, что это возможно), массив не получит непрерывную память из-за созданной вами переменной (вместо переменной могут присутствовать какие-либо данные).

Массив, в котором хранится элемент

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

В памяти пространство памяти массива разделено на подблоки, каждый подблок имеет размер типа данных, а количество блоков - это размер массива.

Теперь субблоки массива являются индексом или нижним индексом.

Индекс массива начинается с 0, что означает, что если у нас есть размер, равный 10, индексы будут начинаться с 0 до 9.

Причина, по которой индексы массива начинаются с 0, заключается в том, что архитектура компьютерной памяти

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

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

Адрес смещения = базовый адрес + смещение.

Теперь в массиве базовый адрес - это массив [0].

Если массив начинается с 1 и мы применяем указанную выше формулу адреса смещения для первого элемента.

Адрес смещения первого элемента = базовый адрес массива + индекс * размер - 1

Это вычитание приводит к снижению производительности, поэтому массив начинается с 0.

Теперь часть, почему массив - плохой выбор

1) Размер изменить нельзя

После того, как вы объявили массив, вы не можете изменить его размер из-за выделенной ему статической памяти.

2) Реализация структур данных с использованием массива

Теперь, если взять пример реализации структуры данных Stack с использованием массива, есть очевидный недостаток.

Возьмем POP-операцию стека. Алгоритм будет примерно таким

1) проверьте отсутствие переполнения стека
2) уменьшите верхнюю часть на 1

Итак, мы делаем то, что указатель на самый верхний элемент является декрементом, что означает, что мы просто ограничиваем наше представление, на самом деле этот элемент остается там, говоря о пространстве памяти, если у вас есть какой-либо примитивный тип данных, тогда это может быть хорошо, но объект массива займет чертовски много памяти, и мы тратим ее впустую, что означает потерю пользовательской базы.

Как это решить? Вы могли подумать

Теперь мы знаем, что наличие элементов в непрерывной памяти имеет свои плюсы и минусы.
Нам нужно выбрать структуру данных динамического распределения памяти. Таким образом, можно использовать ArrayList и Dynamic Array или любую другую динамическую структуру данных.