Сегодня мы посмотрим на пример работы с массивами в Java. Массив - это выделенная область памяти в виде последовательных "ячеек", в которых хранятся значения того типа, с которым объявлен массив. Доступ к массиву производится по индексу, который начинается с 0. Т.е. если у нас есть целочисленный массив a, состоящий из 10 элементов, то доступ к первому элементу осуществляется через a[0], ко второму - через a[1], к последнему - через a[9].
Ниже небольшая программа ArraysExample на Java, которая демонстрирует возможности определения и инициализации целочисленных массивов типа int:
package ru.allineed.samples.arrays;
public class ArraysExample {
public static void main(String[] args) {
int[] a1 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int a2[] = {-1, 22, 37};
for (int i = 0; i < a1.length; i++) {
System.out.print((i > 0 ? " " : "") + a1[i]);
}
System.out.println();
for (int i = 0; i < a2.length; i++) {
System.out.print((i > 0 ? " " : "") + a2[i]);
}
System.out.println();
int[] a3 = new int[a1.length];
for (int i = 0; i < a3.length; i++) {
a3[i] = i * (i + 1);
System.out.print((i > 0 ? " " : "") + a3[i]);
}
// [RU] Статическое определение элементов двумерного массива
// [EN] Static initialization of two-dimensional array
int[][] b1 = {{1, 2}, {3, 4}, {5, 6}};
for (int i = 0; i < b1.length; i++) {
System.out.println();
for (int j = 0; j < b1[i].length; j++) {
System.out.print(b1[i][j] + " ");
}
}
// [RU] Можно также динамически выделить память под массив, не определяя его элементы сразу
// [EN] You can also allocate the memory for the array dynamically, without initializing its elements at once
int[][] b2 = new int[3][3];
// [RU] Задаём значения массива динамически в циклах
// [EN] Set the values for the array elements dynamically in two 'for' loops
for (int i = 0; i < b2.length; i++) {
for (int j = 0; j < b2[i].length; j++) {
b2[i][j] = i + j;
}
}
// [RU] Выводим значения массива
// [EN] Print the values of the array elements
for (int[] b2_lines : b2) {
System.out.println();
for (int b2_cell_value : b2_lines) {
System.out.print(b2_cell_value + " ");
}
}
}
}
Первые два массива a1, a2 инициализированы статически с указанием их значений. Память под третий массив a3 выделяется динамически через оператор new и размером, равным размеру массива a1 за счёт указания в квадратных скобках a1.length. Расчёт значений для элементов массива a3 производится прямо в цикле по его элементам - как видим очередному элементу присваиваем значение индекса, умноженного на выражение (индекс_элемента + 1) - т.е. a3[i] = i * (i + 1).
При запуске программы на консоль в первых трёх строках будут выведены элементы трёх массивов a1, a2, a3:
1 2 3 4 5 6 7 8 9 10
-1 22 37
0 2 6 12 20 30 42 56 72 90
В примере выше для задания массивов a1, a2, a3 был использован одномерный массив типа int. В Java также есть и возможность задания многомерных массивов, что продемонстрировано на примере определения массивов с именами b1 и b2:
// [RU] Статическое определение элементов двумерного массива
// [EN] Static initialization of two-dimensional array
int[][] b1 = {{1, 2}, {3, 4}, {5, 6}};
// [RU] Можно также динамически выделить память под массив, не определяя его элементы сразу
// [EN] You can also allocate the memory for the array dynamically, without initializing its elements at once
int[][] b2 = new int[3][3];
Из отличий - дополнительная пара квадратных скобок и отдельный уровень вложенности с фигурными скобками внутри внешних фигурных скобок - в случае статического определения массива. В первой строке примера можно сказать, что мы задали массив int[3][2], т.е. для доступа, например, к элементу 5 этого двумерного массива, нужно будет написать b1[2][0].
Двумерный массив ещё называют матрицей, он может быть представлен в виде таблицы, где первый индекс указывает на номер строки, а второй индекс указывает на номер столбца. Это упрощает визуальное восприятие того, как расположены элементы матрицы. Например:
// 1 2
// 3 4
// 5 6
Если выписать все элементы матрицы таким образом, становится понятно, почему для получения элемента 5 используется запись b1[2][0] - поскольку нумерация индексов для конкретной размерности массива начинается с 0, то 3-я строка соответствует индексу 2, а 1-й столбец соответствует индексу 0, поэтому это именно b1[2][0], а не b1[3][1], как может показаться для тех, кто не привык, что нумерация диапазонов начинается с нуля.
После определения двумерных массивов b1 и b2, а также инициализации массива b2 в отдельном цикле, мы выводим элементы обоих массивов на экран. На вашей консоли во второй части вывода вы должны увидеть следующее:
1 2
3 4
5 6
0 1 2
1 2 3
2 3 4
Надеюсь, что эта короткая статья дала общее понимание того, как использовать одномерные и многомерные массивы в Java. Если остались какие-то вопросы, напишите их в комментариях к статье.
Примеры из этой статьи: https://github.com/AllineedRu/JavaExamples/blob/main/allineed-core/src/main/java/ru/allineed/samples/arrays/ArraysExample.java