Что такое массив?
- Массив — это набор элементов, каждый из которых идентифицируется индексом или ключом.
- Массивы имеют фиксированный и динамический размер
- Однородные элементы → все элементы массива имеют один и тот же тип данных.
- Разнородные элементы → допускается использование разных типов данных в одном массиве.
// Homogeneous
int[] intArray = new int[5]; // Array of integers String[]
stringArray = new String[5]; // Array of strings
// Heterogeneous
mixedArray = [1, "hello", 3.14, True] # Mixed data types in one list
Характеристики массивов
- Индексация: индексация с нулевой отсчетом в большинстве языков программирования.
- Размер: фиксированный размер (статический), не может быть изменен динамически (кроме языков с динамическими массивами).
- Распределение памяти: непрерывное выделение памяти для элементов массива. это означает, что каждый элемент находится непосредственно рядом с предыдущим в памяти. Это возможно, поскольку все элементы имеют одинаковый размер, что позволяет системе вычислить адрес памяти любого элемента по его индексу.

Операции с массивами
- Вставка: обычно включает в себя сдвиг элементов, временная сложность O(n).
- Удаление. Подобно вставке, элементы, возможно, придется сместить. Кроме последнего индекса
- Обход: перебор всех элементов, временная сложность O(n).
- Время доступа: временная сложность O(1) для доступа к элементу по его индексу.
Типы массивов
- Одномерный массив: простейшая форма, например список.
- Многомерный массив: массивы массивов (например, 2D-массив).
- Неровный массив: массивы с подмассивами разной длины.
- Динамические массивы (например, ArrayList в Java): массивы, размер которых может динамически увеличиваться.
Преимущества массивов
- Эффективность: время доступа к элементам O(1).
- Использование памяти: эффективное использование памяти благодаря непрерывному хранению.
- Простота использования: упрощает управление данными и такие операции, как сортировка и поиск
Недостатки массивов
- Фиксированный размер: невозможно изменить размер после его объявления. кроме динамического массива
- Стоимость вставки/удаления: O(n) для вставки или удаления элемента, особенно в середине.
- Потеря памяти: неиспользуемые элементы по-прежнему занимают место.
Реальные применения массивов
- Хранение данных: часто используется в программировании для хранения коллекций элементов.
- Алгоритмы сортировки: многие алгоритмы сортировки разработаны для массивов (например, QuickSort, MergeSort).
- Матричные операции: двумерные массивы используются для матричных операций в математике и графике.
- Реализация стеков и очередей: базовые структуры данных можно реализовать с помощью массивов.
Лучшие практики работы с массивами
- Избегайте ненужных копий: помните об операциях, требующих копирования элементов.
- При необходимости используйте динамические массивы: если размер неизвестен, отдайте предпочтение динамическим массивам.
- Используйте встроенные функции: используйте функции, специфичные для языка, для операций с массивами.
- Проверка границ: всегда проверяйте граничные условия, чтобы избежать исключения IndexOutOfBoundsException.
Пример статического и динамического массива в GO
package main
import (
"fmt"
"unsafe"
)
func main() {
// Static Array
var staticArr [5]int64
staticArr[0] = 1
staticArr[1] = 2
staticArr[2] = 3
staticArr[3] = 4
staticArr[4] = 5
elementSize := unsafe.Sizeof(staticArr[0])
totalSize := elementSize * uintptr(len(staticArr))
fmt.Printf("Memory used by static array: %d bytes\n", totalSize)
fmt.Println()
// Dynamic Array (Slice)
dynamicArr := make([]int32, 0, 5)
before := unsafe.Sizeof(dynamicArr[0])
beforeTotal := before * uintptr(len(dynamicArr))
fmt.Printf("Memory used by dynamic array (before): %d bytes\n", beforeTotal)
// Append elements to dynamic array
for i := 0; i