Массивы в Java: как объявить и инициализировать? Полный гайд

Онлайн-тренажер Python для начинающих

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

Начать курс

Введение: почему этот вопрос мучает даже опытных Java-разработчиков?

Если вы когда-нибудь гуглили «How do I declare and initialize an array in Java?», вы не одиноки. Этот вопрос на Stack Overflow собрал сотни тысяч просмотров и продолжает расти. Казалось бы, что тут сложного? Но дьявол, как всегда, кроется в деталях. Java — это язык со строгой типизацией, и синтаксис массивов здесь может сбить с толку новичка.

В этой статье мы разберем все возможные способы объявления и инициализации массивов в Java. Вы узнаете, чем отличается int[] arr от int arr[], как правильно создавать массивы объектов, а также как не попасть в ловушку NullPointerException. Поехали!

1. База: что такое массив в Java?

Массив в Java — это контейнер, который хранит фиксированное количество элементов одного типа. В отличие от Python или JavaScript, где массивы могут быть динамическими, в Java размер массива задается при создании и не может быть изменен.

int[] numbers; // объявление (declaration)
numbers = new int[5]; // инициализация (initialization) — выделение памяти на 5 элементов

В первой строке мы говорим компилятору: «Я хочу создать переменную, которая будет ссылаться на массив целых чисел». Во второй — выделяем память под 5 элементов. Только после этого массив готов к использованию.

2. Способы объявления массива

В Java существует два синтаксиса объявления массива. Оба валидны, но сообщество Java (и официальные стандарты кодирования Oracle) рекомендует первый вариант.

Способ 1: тип данных + квадратные скобки перед именем переменной

int[] myArray;
String[] names;
double[] prices;

Способ 2: квадратные скобки после имени переменной (C/C++ стиль)

int myArray[];
String names[];
double prices[];

Какой из них выбрать? Первый вариант читается более естественно: int[] myArray — «массив целых чисел с именем myArray». Второй вариант может сбивать с толку, особенно когда вы объявляете несколько переменных в одной строке:

int[] arr1, arr2; // обе переменные — массивы
int arr3[], arr4; // arr3 — массив, arr4 — обычное целое число (ошибка!)

Поэтому всегда используйте тип[] имя.

3. Инициализация массива: 4 проверенных способа

После объявления массив нужно инициализировать. Вот как это сделать правильно.

Способ 1: Создание пустого массива с указанием размера

int[] numbers = new int[10]; // массив из 10 элементов, все равны 0 (по умолчанию)
String[] words = new String[5]; // массив из 5 строк, все равны null

Этот способ подходит, если вы планируете заполнять массив позже (например, в цикле). Важно помнить: для числовых типов значения по умолчанию — 0, для boolean — false, для ссылочных типов — null.

Способ 2: Инициализация с помощью литерала массива

int[] numbers = {1, 2, 3, 4, 5};
String[] fruits = {"apple", "banana", "orange"};

Это самый короткий и удобный способ, когда вы заранее знаете все элементы. Обратите внимание: такой синтаксис работает только при объявлении.

Способ 3: Анонимный массив (без имени переменной)

int[] numbers = new int[]{1, 2, 3, 4, 5};

Этот вариант пригодится, когда нужно передать массив в метод, не создавая отдельную переменную:

printArray(new int[]{10, 20, 30});

Способ 4: Инициализация через цикл

int[] squares = new int[10];
for (int i = 0; i < squares.length; i++) {
    squares[i] = (i + 1) * (i + 1);
}

Идеально для динамического заполнения, например, вычисления значений или чтения данных из файла.

4. Частые ошибки и как их избежать

Давайте разберем типичные грабли, на которые наступают новички (и не только).

Ошибка 1: Использование литерала массива не при объявлении

int[] numbers;
numbers = {1, 2, 3}; // Ошибка компиляции!

Решение: используйте new int[]{1, 2, 3}.

Ошибка 2: Выход за границы массива

int[] arr = new int[3];
arr[3] = 10; // ArrayIndexOutOfBoundsException

Помните: индексы начинаются с 0, последний элемент имеет индекс length - 1.

Ошибка 3: Путаница между размером и длиной

int[] arr = new int[5];
System.out.println(arr.length); // 5 — это свойство, а не метод!

В Java length — это поле, а не метод, в отличие от String.length(). Скобки не нужны.

5. Массивы объектов: особенности

С массивами объектов все чуть сложнее. Когда вы создаете массив объектов, вы выделяете место под ссылки, но сами объекты не создаются.

String[] names = new String[3]; // массив из 3 null-ссылок
names[0] = "Alice"; // теперь в первой ячейке ссылка на строку "Alice"
names[1] = new String("Bob"); // альтернативный способ

Если вы попытаетесь вызвать метод на неинициализированном элементе, получите NullPointerException.

String[] names = new String[3];
System.out.println(names[0].toUpperCase()); // NullPointerException!

6. Многомерные массивы: не бойтесь, это просто

Двумерный массив — это «массив массивов». Вот как его объявить и инициализировать:

int[][] matrix = new int[3][4]; // 3 строки, 4 столбца

// Или с литералом:
int[][] matrix = {
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9}
};

Важно: в Java многомерные массивы могут быть «рваными» (jagged arrays) — строки разной длины:

int[][] jagged = new int[3][];
jagged[0] = new int[2];
jagged[1] = new int[5];
jagged[2] = new int[3];

7. Современный подход: Arrays utility class

Начиная с Java 8, у нас есть удобные методы для работы с массивами. Вот несколько полез

Блоги

Рекомендаций по книгам