Гид по технологиям

Массивы в Java: хранение, доступ и примеры

6 min read Java Обновлено 12 Apr 2026
Массивы в Java: хранение и доступ
Массивы в Java: хранение и доступ

Очки на фоне панели кода

Введение: что такое массив

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

Определение в одну строку: массив — упорядоченная коллекция однотипных элементов с индексами от 0 до length-1.

Важно: в Java размер массива фиксирован при создании. Если нужен изменяемый список — используйте коллекции из java.util.

Ключевые понятия

  • Индекс — позиция элемента в массиве, начинается с 0.
  • length — поле массива, возвращает количество элементов (длина массива).
  • Значения по умолчанию: для числовых типов 0, для boolean — false, для ссылочных типов — null.

Примечание: попытка обратиться к элементу за пределами [0, length-1] вызовет ArrayIndexOutOfBoundsException.

Объявление массива в Java

В Java массив можно объявлять несколькими способами. Ниже — базовый пример объявления с последующим созданием объекта массива:

public class Arrays {   
public static void main(String[] args) {   
// объявление целочисленного массива
int[] arr1 = new int[10];  
}  
}

В этом примере создан массив arr1, который может хранить 10 целых чисел. Индексы для этого массива будут от 0 до 9.

Заполнение массива поэлементно

Если элементы известны по одному, можно присваивать их по индексам:

public class Arrays {  
public static void main(String[] args) {  
// объявление целочисленного массива  
int[] arr1 = new int[10];  
  
// заполняем массив 10 целыми числами  
arr1[0] = 2;  
arr1[1] = 4;  
arr1[2] = 6;  
arr1[3] = 8;  
arr1[4] = 10;  
arr1[5] = 12;  
arr1[6] = 14;  
arr1[7] = 16;  
arr1[8] = 18;  
arr1[9] = 20;  
}  
}

Если пропустить присвоение для какого‑то индекса у примитивного типа (int, double и т.п.), то элемент получит значение по умолчанию (для int — 0).

Однострочное объявление и инициализация

Удобный способ объявить и одновременно заполнить массив литералом:

public class Arrays {  
public static void main(String[] args) {  
// объявляем и сразу заполняем массив 10 нечетных чисел  
int[] arr2 = {1,3,5,7,9,11,13,15,17,19};  
}  
}

Этот синтаксис удобен, когда все элементы заранее известны.

Чтение элемента массива

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

public class Arrays {  
public static void main(String[] args) {  
// объявление и инициализация массива  
int[] arr2 = {1,3,5,7,9,11,13,15,17,19};  
  
// вывод значения на позицию 5  
System.out.println(arr2[5]);  
}  
}

Результат на консоли:

11

Если нужно получить много элементов или пройти весь массив — используют циклы.

Итерация по массиву с помощью for

Для последовательного доступа к элементам идеально подходит классический for:

public class Arrays {  
public static void main(String[] args) {  
// объявление и инициализация массива  
int[] arr2 = {1,3,5,7,9,11,13,15,17,19};  
// объявляем переменную-счетчик  
int count;  
  
// используем for чтобы напечатать каждый элемент  
for(count = 0; count < arr2.length; count++) {  
System.out.println(arr2[count]);  
}  
}  
}

Результат вывода будет последовательностью элементов массива:

1
3
5
7
9
11
13
15
17
19

Совет: для простоты можно использовать также for‑each:

for (int value : arr2) {
  System.out.println(value);
}

Когда массивы не подходят: ограничения и альтернативы

Важно: массивы хороши для фиксированного набора элементов и быстрого доступа по индексу. Но у массивов есть ограничения:

  • Фиксированный размер: изменить длину нельзя без создания нового массива.
  • Меньше удобных методов для вставки/удаления внутри: операции вставки/удаления в середине требуют сдвигов.
  • Работа с объектами требует внимания к null и ссылочным типам.

Альтернативы в Java:

  • ArrayList — динамический массив, автоматически расширяется, удобные методы add, remove, contains.
  • LinkedList — двусвязный список, эффективен для частых вставок/удалений в середине.
  • Collections и утилиты из java.util.Arrays для сортировки, поиска, преобразований.

Пример использования ArrayList:

import java.util.ArrayList;

public class ListExample {
  public static void main(String[] args) {
    ArrayList list = new ArrayList<>();
    list.add(1);
    list.add(3);
    list.add(5);
    System.out.println(list.get(1)); // 3
  }
}

Ментальные модели и эвристики

  • Массив как «полка с ячейками»: каждая ячейка пронумерована от 0 до length-1.
  • Если вам нужно «статически» упаковать элементы и быстро читать/писать по индексам — массивы подходят.
  • Если нужен гибкий размер или богатый API — выбирайте коллекции.

Правило большой картины: массив = скорость доступа по индексу и экономия памяти; коллекция = гибкость и удобство API.

Контрпримеры: когда массивы вводят в заблуждение

  • Предположим, вам нужно хранить растущий поток данных неопределённой длины (логи, события) — массив заставит вас регулярно копировать данные в новый массив.
  • Частые вставки в начало или середину массива приведут к O(n) сдвигам, что неприемлемо для больших объёмов.

В таких сценариях ArrayList или специализированные очереди/буферы работают лучше.

Факт‑бокс: ключевые числа и свойства

  • Индексация: начинается с 0.
  • length: поле (не метод) массива в Java — arr.length.
  • default values: int → 0, long → 0L, double → 0.0, boolean → false, объекты → null.
  • Доступ по индексу: O(1). Вставка/удаление в середине: O(n).

Критерии приёмки для задачи с массивами

  • Массив объявлен с корректным типом и размером.
  • Нет выхода за пределы индексов (отсутствуют ArrayIndexOutOfBoundsException).
  • Для примитивных типов предусмотрены значения по умолчанию или явная инициализация.
  • Для ссылочных типов обработаны возможные null‑значения.
  • Тесты покрывают крайние случаи: пустой массив, массив из одного элемента, максимум ожидаемой длины.

Роли и чек‑листы

Для младшего разработчика:

  • Проверить, что массив объявлен с верным размером.
  • Использовать arr.length в циклах.
  • Избегать магических чисел при обращении по индексу.

Для ведущего разработчика:

  • Оценить, подходит ли массив по производительности и требованиям по масштабируемости.
  • Рассмотреть замены на ArrayList/LinkedList при необходимости.
  • Добавить юнит‑тесты и граничные проверки.

Для тестировщика:

  • Написать тесты на граничные индексы, пустые массивы и некорректные входные данные.
  • Проверить поведение при null для массивов ссылочных типов.

Мини‑методология: как выбрать между массивом и коллекцией

  1. Определите, будет ли размер фиксированным. Да → массив; нет → коллекция.
  2. Нужны ли частые вставки/удаления в середине? Да → LinkedList или специализированная структура.
  3. Нужен ли быстрый произвольный доступ по индексу? Да → массив или ArrayList.
  4. Требуется ли потокобезопасность? Да → используйте синхронизированные коллекции или Concurrent структуры.

Примеры тестовых случаев

  • Пустой массив: int[] a = new int[0]; убедиться, что цикл не выполняется.
  • Одна запись: массив длины 1 — корректность записи/чтения.
  • Выход за границы: чтение a[-1] или a[length] — должны приводить к исключению.
  • Null для ссылочного массива: String[] s = new String[3]; считать s[0] → null.

Безопасность и производительность

  • Не делайте ненужных копий массивов при передаче в методы — используйте Arrays.copyOf, если нужна копия.
  • Для больших массивов следите за расходом памяти: помните о примитивах vs объектных типах (Integer[] использует больше памяти, чем int[]).
  • В многопоточной среде при одновременном доступе на запись используйте внешнюю синхронизацию или конкурентные коллекции.

Важно: массивы не обеспечивают автоматической синхронизации; при параллельном модифицировании нужны механизмы синхронизации.

Советы по миграции с массивов на коллекции

  • Замените int[] на List только после оценки накладных расходов (автоупаковка/распаковка увеличит использование памяти и CPU).
  • Для больших примитивных наборов рассмотрите специализированные библиотеки (Troves, fastutil) для коллекций примитивов.

Короткий глоссарий

  • Массив — упорядоченная коллекция однотипных элементов.
  • Индекс — позиция элемента (целое число).
  • length — поле массива, его длина.
  • ArrayList — динамический массив из java.util.

Заключение

Массивы — базовый и эффективный инструмент для хранения однотипных данных в Java. Они удобны для быстрого доступа по индексу и экономичного хранения, но имеют фиксированный размер и ограниченный набор операций. В большинстве практических задач рекомендуется комбинировать массивы (для низкоуровневой оптимизации) и коллекции (для удобства разработки и гибкости).

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


Если вам нужно, могу добавить примеры с многомерными массивами, разбором ошибок ArrayIndexOutOfBoundsException и готовыми unit‑тестами JUnit для проверки поведения массивов.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Подготовка к техническому собеседованию разработчика
Карьера

Подготовка к техническому собеседованию разработчика

Запуск мастера устранения неполадок в Windows
Windows

Запуск мастера устранения неполадок в Windows

Как создать мем: полное руководство
Социальные сети

Как создать мем: полное руководство

Как устранить BSOD 0x0000003B в Windows
Windows

Как устранить BSOD 0x0000003B в Windows

Clone Stamp в Photoshop — подробное руководство
Графика

Clone Stamp в Photoshop — подробное руководство

Синхронизация звука и видео в After Effects
Видео монтаж

Синхронизация звука и видео в After Effects