JavaRush/Java блог/Java Developer/Массивы в Java
Автор
Александр Мяделец
Руководитель команды разработчиков в CodeGym

Массивы в Java

Статья из группы Java Developer
участников
Массив в Java это структура данных для хранения нескольких элементов одного типа в пронумерованных ячейках. Доступ к любому элементу идет по его номеру (индексу), а нумерация начинается с нуля. Представьте себе ячейки в камере хранения. Каждая имеет свой номер, и в каждой хранится какой-то объект "Багаж". Или винная карта, в которой все виды вина пронумерованы и когда вы делаете заказ, вам достаточно назвать номер напитка. Или список студентов группы, в котором в первой ячейке будет записан студент "Андреев", а в последней "Яковлев". Или список пассажиров самолета, за каждым из которых закреплено место с определенным номером. В Java чтобы работать с подобными структурами, то есть множеством однородных данных, часто используют массивы.

Кратко

  • Массив это структура данных для хранения нескольких элементов одного типа в пронумерованных ячейках.
  • Объявление: int[] myArray; создание: myArray = new int[10]; (или сразу вместе).
  • Элементы нумеруются с нуля; доступ к элементу по индексу: myArray[0].
  • Длину массива нельзя изменить после создания; узнать ее можно через myArray.length.
  • После создания ячейки заполнены значениями по умолчанию: 0 для чисел, false для boolean, null для ссылочных типов.
  • Массивы бывают одномерные и многомерные (например, int[][]); для сортировки, поиска и вывода есть класс Arrays.

Что такое массив?

Массив это структура данных, в которой хранятся элементы одного типа. Его можно представить, как набор пронумерованных ячеек, в каждую из которых можно поместить какие-то данные (один элемент данных в одну ячейку). Доступ к конкретной ячейке осуществляется через ее номер. Номер элемента в массиве также называют индексом. В случае с Java массив однороден, то есть во всех его ячейках будут храниться элементы одного типа. Так, массив целых чисел содержит только целые числа (например, типа int), массив строк только строки, массив из элементов созданного нами класса Dog будет содержать только объекты Dog. То есть в Java мы не можем поместить в первую ячейку массива целое число, во вторую String, а в третью "собаку". Массив в Java: набор пронумерованных ячеек с элементами одного типа

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

Как объявить массив?

Как и любую переменную, массив в Java нужно объявить. Сделать это можно одним из двух способов. Они равноправны, но первый из них лучше соответствует стилю Java. Второй же это наследие языка Си (многие Си-программисты переходили на Java, и для их удобства был оставлен и альтернативный способ). В таблице приведены оба способа объявления массива в Java:
№ Объявление массива, Java-синтаксис Примеры Комментарий
1.
dataType[] arrayName;
int[] myArray;

Object[]
arrayOfObjects;
Желательно объявлять массив именно таким способом, это Java-стиль
2.
dataType arrayName[];
int myArray[];

Object
arrayOfObjects[];
Унаследованный от С/С++ способ объявления массивов, который работает и в Java
В обоих случаях dataType это тип переменных в массиве. В примерах мы объявили два массива. В одном будут храниться целые числа типа int, в другом объекты типа Object. Таким образом при объявлении массива у него появляется имя и тип (тип переменных массива). arrayName это имя массива.

Создание массива

Как создать массив?

Как и любой другой объект, создать массив Java, то есть зарезервировать под него место в памяти, можно с помощью оператора new. Делается это так:
new typeOfArray [length];
Где typeOfArray это тип массива, а length его длина (то есть, количество ячеек), выраженная в целых числах (int). Однако здесь мы только выделили память под массив, но не связали созданный массив ни с какой объявленной ранее переменной. Обычно массив сначала объявляют, а потом создают, например:
int[] myArray; // объявление массива
myArray = new int[10]; // создание, то есть, выделение памяти для массива на 10 элементов типа int
Здесь мы объявили массив целых чисел по имени myArray, а затем сообщили, что он состоит из 10 ячеек (в каждой из которых будет храниться какое-то целое число). Однако гораздо чаще массив создают сразу после объявления с помощью такого сокращенного синтаксиса:
int[] myArray = new int[10]; // объявление и выделение памяти “в одном флаконе”
Обратите внимание: После создания массива с помощью new, в его ячейках записаны значения по умолчанию. Для численных типов (как в нашем примере) это будет 0, для boolean это false, для ссылочных типов это null. Коротко значения по умолчанию можно свести в таблицу:
Тип элементовЗначение по умолчанию
Числовые (int, double и т.д.)0 (или 0.0)
booleanfalse
Ссылочные (String, объекты)null
Таким образом после операции
int[] myArray = new int[10];
мы получаем массив из десяти целых чисел, и, пока это не изменится в ходе программы, в каждой ячейке записан 0.

Больше информации о массивах есть в статье "Кое-что о массивах"

Длина массива в Java

Как мы уже говорили выше, длина массива это количество элементов, под которое рассчитан массив. Длину массива нельзя изменить после его создания. Если нужна структура, которая расширяется автоматически, используют ArrayList. Обратите внимание: в Java элементы массива нумеруются с нуля. То есть, если у нас есть массив на 10 элементов, то первый элемент массива будет иметь индекс 0, а последний 9. Нумерация элементов массива в Java начинается с нуляПолучить доступ к длине массива можно с помощью переменной length. Пример:
int[] myArray = new int[10]; // создали массив целых чисел на 10 элементов и присвоили ему имя myArray
System.out.println(myArray.length); // вывели в консоль длину массива, то есть количество элементов, которые мы можем поместить в массив
Вывод программы:
10

Инициализация массива и доступ к его элементам

Как создать массив в Java уже понятно. После этой процедуры мы получаем не пустой массив, а массив, заполненный значениями по умолчанию. Например, в случае int это будут 0, а если у нас массив с данными ссылочного типа, то по умолчанию в каждой ячейке записаны null. Получаем доступ к элементу массива (то есть записываем в него значение или выводим его на экран или проделываем с ним какую-либо операцию) мы по его индексу. Инициализация массива это заполнение его конкретными данными (не по умолчанию). Пример: давайте создадим массив из 4 сезонов и заполним его строковыми значениями, названиями этих сезонов.
String[] seasons  = new String[4]; /* объявили и создали массив. Java выделила память под массив из 4 строк, и сейчас в каждой ячейке записано значение null (поскольку строка это ссылочный тип)*/

seasons[0] = "Winter"; /* в первую ячейку, то есть, в ячейку с нулевым номером мы записали строку Winter. Тут мы получаем доступ к нулевому элементу массива и записываем туда конкретное значение  */
seasons[1] = "Spring"; // проделываем ту же процедуру с ячейкой номер 1 (второй)
seasons[2] = "Summer"; // ...номер 2
seasons[3] = "Autumn"; // и с последней, номер 3
Теперь во всех четырех ячейках нашего массива записаны названия сезонов. Инициализацию также можно провести по-другому, совместив с инициализацией и объявлением:
String[] seasons  = new String[] {"Winter", "Spring", "Summer", "Autumn"};
Более того, оператор new можно опустить:
String[] seasons  = {"Winter", "Spring", "Summer", "Autumn"};

Как вывести массив в Java на экран?

Вывести элементы массива на экран (то есть, в консоль) можно, например, с помощью цикла for. Еще один, более короткий способ вывода массива на экран будет рассмотрен в пункте "Полезные методы для работы с массивами", ниже. А пока рассмотрим пример с циклическим выводом массива:
String[] seasons  = new String[] {"Winter", "Spring", "Summer", "Autumn"};
for (int i = 0; i < 4; i++) {
System.out.println(seasons[i]);
}
В результате программа выведет следующий результат:
Winter Spring Summer Autumn

Одномерные и многомерные Java массивы

А что, если мы захотим создать не массив чисел, массив строк или массив каких-то объектов, а массив массивов? Java позволяет это сделать. Уже привычный нам массив int[] myArray = new int[8] это так называемый одномерный массив. А массив массивов называется двумерным. Он похож на таблицу, у которой есть номер строки и номер столбца. Или, если вы учили начала линейной алгебры, на матрицу. Двумерный массив в Java как таблица из строк и столбцовДля чего нужны такие массивы? В частности, для программирования тех же матриц и таблиц, а также объектов, напоминающих их по структуре. Например, игровое поле для шахмат можно задать массивом 8х8. Многомерный массив объявляется и создается следующим образом:
int[][] myTwoDimentionalArray = new int [8][8];
В этом массиве ровно 64 элемента: myTwoDimentionalArray[0][0], myTwoDimentionalArray[0][1], myTwoDimentionalArray[1][0], myTwoDimentionalArray[1][1] и так далее вплоть до myTwoDimentionalArray[7][7]. Так что если мы с его помощью представим шахматную доску, то клетку А1 будет представлять myTwoDimentionalArray[0][0], а E2 это myTwoDimentionalArray[4][1]. Где два, там и три. В Java можно задать массив массивов… массив массивов массивов и так далее. Правда, трехмерные и более массивы используются очень редко. Тем не менее, с помощью трехмерного массива можно запрограммировать, например, кубик Рубика.

Что еще почитать

Многомерные массивы

Полезные методы для работы с массивами

Для работы с массивами в Java есть класс java.util.Arrays (arrays на английском и означает "массивы"). В целом с массивами чаще всего проделывают следующие операции: заполнение элементами (инициализация), извлечение элемента (по номеру), сортировка и поиск. Поиск и сортировка массивов это тема отдельная. С одной стороны очень полезно потренироваться и написать несколько алгоритмов поиска и сортировки самостоятельно. С другой стороны, все лучшие способы уже написаны и включены в библиотеки Java, и ими можно законно пользоваться. Вот три полезных метода этого класса

Сортировка массива

Метод void sort(int[] myArray, int fromIndex, int toIndex) сортирует массив целых чисел или его подмассив по возрастанию.

Поиск в массиве нужного элемента

int binarySearch(int[] myArray, int fromIndex, int toIndex, int key). Этот метод ищет элемент key в уже отсортированном массиве myArray или подмассиве, начиная с fromIndex и до toIndex. Если элемент найден, метод возвращает его индекс, если нет, возвращает (-fromIndex)-1.

Преобразование массива к строке

Метод String toString(int[] myArray) преобразовывает массив к строке. Дело в том, что в Java массивы не переопределяют toString(). Это значит, что если вы попытаетесь вывести целый массив (а не по элементам, как в пункте "Вывод массива на экран") на экран непосредственно (System.out.println(myArray)), вы получите имя класса и шестнадцатеричный хэш-код массива (это определено Object.toString()). Если вы новичок, вам, возможно, непонятно пояснение к методу toString. На первом этапе это и не нужно, зато с помощью этого метода упрощается вывод массива. Java позволяет легко выводить массив на экран без использования цикла. Об этом в примере ниже. Коротко эти три метода класса Arrays можно свести в таблицу:
МетодЧто делает
Arrays.sort(array)сортирует массив по возрастанию
Arrays.binarySearch(array, key)ищет элемент в отсортированном массиве и возвращает его индекс
Arrays.toString(array)преобразует массив в читаемую строку для вывода на экран

Пример на sort, binarySearch и toString

Давайте создадим массив целых чисел, выведем его на экран с помощью toString, отсортируем с помощью метода sort и найдем в нем какое-то число.
class Main {
    public static void main(String[] args) {
        int[] array = {1, 5, 4, 3, 7}; //объявляем и инициализируем массив
        System.out.println(array);//пытаемся вывести наш массив на экран без метода toString - получаем 16-ричное число
        System.out.println(Arrays.toString(array));//печатаем массив "правильно"
        Arrays.sort(array, 0, 4); //сортируем весь массив от нулевого до четвертого члена
        System.out.println(Arrays.toString(array));//выводим отсортированный массив на экран
        int key = Arrays.binarySearch(array, 5); // ищем key - число 5 в отсортированном массиве.
        //метод binarySearch выдаст индекс элемента остортированного массива, в котором "спрятано" искомое число
        System.out.println(key);//распечатываем индекс искомого числа
System.out.println(Arrays.binarySearch(array, 0));//а теперь попробуем найти число, которого в массиве нет,
        // и сразу же выведем результат на экран

    }
}
Вывод программы:
[I@1540e19d [1, 5, 4, 3, 7] [1, 3, 4, 5, 7] 3 -1
В первой строке попытка вывода на экран массива без toString, во второй вывод массива посредством toString, в третьей выведен отсортированный массив, в четвертой индекс искомого числа 5 в отсортированном массиве (помните, что считаем с нуля, поэтому четвертый элемент массива имеет индекс 3). В пятой строке видим значение -1. Такого индекса у массива не бывает. Вывод сигнализирует о том, что искомого элемента (в данном случае, 0) в массиве нет.

Больше о методах класса Array

Класс Arrays и его использование это статья, где описаны некоторые методы класса Array

Главное о массивах

  • Главные характеристики массива: тип помещенных в него данных, имя и длина.
    Последнее решается при инициализации (выделении памяти под массив), первые два параметра определяются при объявлении массива.

  • Размер массива (количество ячеек) нужно определять в int

  • Изменить длину массива после его создания нельзя.

  • Доступ к элементу массива можно получить по его индексу.

  • В массивах, как и везде в Java, элементы нумеруются с нуля.

  • После процедуры создания массива он наполнен значениями по умолчанию.

  • Массивы в языке Java устроены не так, как в C++. Они почти совпадают с указателями на динамические массивы.

Официальное описание массивов есть в документации Oracle (Arrays).

Полезные материалы о массивах

Хотите знать больше о массивах? Обратите внимание на статьи ниже. Там много интересного и полезного по этой теме.
  1. Кое-что о массивах это хорошая подробная статья о массивах

  2. Класс Arrays и его использование это статья, где описаны некоторые методы класса Array

  3. Многомерные массивы это подробная статья о многомерных массивах с примерами.

  4. Возвращайте массив нулевой длины, а не null это материал, где автор "Эффективного программирования" Джошуа Блох рассказывает о том, как лучше возвращать пустые массивы

Читайте также

Вопросы и ответы

Что такое массив в Java?

Это структура данных, которая хранит несколько элементов одного типа в пронумерованных ячейках. Доступ к элементу осуществляется по его индексу.

Как создать массив в Java?

Объявить и выделить память: int[] myArray = new int[10]. Можно и сразу с данными: int[] myArray = {1, 2, 3}.

С какого числа нумеруются элементы массива?

С нуля. Первый элемент имеет индекс 0, а последний индекс, равный длине массива минус 1.

Как узнать длину массива?

Через поле length: myArray.length. Изменить длину после создания массива нельзя.

Какие значения в массиве по умолчанию?

Для числовых типов 0, для boolean false, для ссылочных типов (например String) null.

Чем массив отличается от ArrayList?

У массива фиксированная длина, заданная при создании. ArrayList это динамический список, который расширяется автоматически и имеет удобные методы add(), remove() и другие.
Комментарии (164)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Валерий ПавлочевJava Developer в Google
18 мая, 16:22
Спасибо за подробную информацию про такую важную и интересную тему как "Массивы"! ✍✍✍
YuliaРаботает в Образовательная орга
26 мая 2025, 16:51
Отлично, а главное - доступное разъяснение) спасибо
Валерий
Уровень 48
24 марта 2025, 07:04
А двумерный массив построчно можно в строки преобразовать?
Soda
Уровень 19
2 января, 14:23
вроде да, создаешь цикл, который проходится построчно и каждую из них преобразуешь в строки методом toString. Но, не вижу в этом особого смысла, ведь существует метод deepToString(), который как раз всё это и делает сам, без цикла.
Soda
Уровень 19
2 января, 14:24
только щас обратил внимание на твой уровень, думаю, ты уже и так знаешь ответ на этот вопрос :)
Anonymous #3463949
Уровень 32
13 января 2025, 20:52
отличная статья
Vitaliy Java Developer
7 января 2025, 14:35
Да , получается чтобы отсортировать полностью надо писать : Arrays.sort(array,0,5) либо Arrays.sort(array,0,array.length).
Zarist Урoвень 999
19 января 2025, 17:24
Нет. в методе sort(int[] myArray, int fromIndex, int toIndex) параметры int fromIndex и toIndex не обязательны. Вы можете писать:
int[] array = {34, 23, 56, 34, 62, 63, 32, 13};
Arrays.sort(array);
System.out.println(Arrays.toString(array)); // Вывод [13, 23, 32, 34, 34, 56, 62, 63 ]
в данном случае будет сортироваться весь массив от начала до конца.
Dmitry
Уровень 13
6 апреля 2025, 19:11
Why not just Arrays.sort (array_name);
Natooa
Уровень 12
1 сентября 2024, 09:05
Классная и подробная статья про массивы в Java, приятным бонусом еще были множество ссылок на лекции. Можете лайкнуть комментарий пожалуйста :D
Сашач
Уровень 3
20 августа 2024, 12:48
Стоит иметь в виду, что в примере в конце статьи код Arrays.sort(array, 0, 4); отсортирует массив кроме последнего элемента, т.к. аргумент обозначающий границу массива с конца идёт невключительно.
КОСМОС
Уровень 15
1 августа 2024, 04:06
Спасибо за статью. Возможно есть опечатка. Вы пишите, что сначала массив объявляют, то есть присваивают ему имя а потом создают, то есть указывают количество элементов массива (его длину) выделяют память. А инициализация это заполнение массива данными. Однако гораздо чаще массив создают сразу после объявления с помощью такого сокращённого синтаксиса: int[] myArray = new int[10]; // объявление и выделение памяти “в одном флаконе” После создания массива с помощью new, в его ячейках записаны значения по умолчанию. Инициализация массива и доступ к его элементам: Инициализация массива — это заполнение его конкретными данными (не по умолчанию). И в самом конце статьи написанно: Главное о массивах Главные характеристики массива: тип помещённых в него данных, имя и длина. Последнее решается при инициализации (или всё таки при создании?) (выделении памяти под массив), первые два параметра определяются при объявлении массива. Вообщем если я правильно понял, то массив сначала объявляют (присваивают имя), затем создают (указывают длину и выделяют память), а затем инициализируют (заполняют данными). Поправьте меня, пожалуйста, если я не правильно понял. Еще раз спасибо!
JAVA • TZH
Уровень 14
3 мая 2024, 17:34
Отлично. Закрепили
Ruslan Machalov
Уровень 14
28 апреля 2024, 06:08
Спасибо за Ваши статьи :)