Массивы в Java

В этом уроке мы познакомимся с массивами в Java: разберём их концепцию, научимся с ними взаимодействовать и узнаем, какие типы массивов бывают.

В прошлых уроках у нас была переменная int a=31 хранящая одно число 31.

А что если мы хотим иметь переменную в которой будет храниться 100 разных числовых значений?

Такая переменная называется массивом.

Объявляется массив так:

int[] a;

[] значат, что это массив и в нем будет храниться много значений (значений типа int в данном случае).

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

Ключевым словом new мы выделяем память под массив, который может вмещать максимум 5 элементов.

a = new int[5];

После этого можно записывать в эту память числа.

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

int[] a = new int[5];

Также можно при создании массива сразу записать в них значения.

int[] b = {56, 3, 7, 63, 13};

Заранее с помощью new память под эти значения выделять не нужно, так как мы сразу записываем в память значения.


Взаимодействие с массивом

Итак рассмотрим как мы можем взаимодействовать с массивом.

Ниже в примере программы создается массив b, который содержит 5 числовых значений.

Каждое из пяти значений имеет свой порядковый номер в массиве:

56 – имеет номер 0, 3 – имеет номер 1, 7 – имеет номер 2, 63 – имеет номер 3, 13 – имеет номер 4. Очевидно, что номера элементам массива выдаются по порядку, то есть первому элементу в массиве номер ноль, второму номер 1, третьему элементу номер 2 и т.д.

Search Icon

Также как видим порядковый номер в массивах начинается с нуля, а не единицы.

Правильно этот порядковый номер в массиве называть индексом.

Поясним на примере:

class Test { public static void main(String []args) { int[] b = {56, 3, 7, 63, 13}; // По индексу мы можем взаимодействовать // с элементами массива. // Например, ниже мы записываем // в элемент массива с индексом 1 число 33. // Индекс указывается в квадратных скобках. // Теперь вместо 3 теперь будет 33. b[1] = 33; // Можно обратиться к элементу по индексу // чтобы его использовать каким-то образом. // Например, вывести на консоль как ниже. System.out.println(b[1]); } }

Вывод:


Обход массива циклом

Выведем все элементы массива b по порядку с помощью for.

Любой массив имеет внутри себя переменную length в которой храниться количество элементов массива. Это можно использовать для обхода элементов циклом.

Поясним на примере:

class Test { public static void main(String []args) { int[] b = {56, 3, 7, 63, 13}; //В данном случае b.length равно 5, //так как в массиве пять элементов. //Условие цикла как видим, такое, что пока i //меньше длины массива (то есть пяти) //цикл for продолжает свое выполнение. for(int i=0; i < b.length; i++) { //Каждую итерацию цикла i увеличивается на 1, //и эту i мы помещаем в квадратные скобки в качестве индекса //для извлечения каждого элемента массива по индексу //на каждой итерации. //То есть на первой итерации на консоль выводится //значение элемента b[0], на второй итерации значение //элемента b[1] и т.д. до b[4] System.out.println(b[i]); } } };

Вывод:

Как видим, можно легко пройтись по элементам массива и совершать с каждым какие-то действия на каждой итерации. Например, выводить на консоль каждый элемент, как в приведенном примере.


Обход массива циклом for-each

Для обхода элементов массива можно использовать особенный вид for цикла.

Называется он for-each.

Используя цикл foreach нам не нужно знать размер массива.

В примере ниже цикл foreach начиная с первого элемента массива b поочереди берет элементы и помещает их в singleArrayElement

class Test { public static void main(String []args) { int[] b = {56, 3, 7, 63, 13}; for(int singleArrayElement : b){ System.out.println(singleArrayElement); } } }

Вывод:

То есть на первой итерации этого цикла берется первый элемент массива b и помещается в переменную singleArrayElement, которая того же типа, что и массив b и в теле цикла можно работать с первым элементом массива через эту переменную, на второй итерации цикла второй элемент помещается в singleArrayElement вместо первого и происходит работа уже со вторым элементом массива, на третьей помещается третий и т.д. до конца массива.

Search Icon

Важно знать: singleArrayElement — это копия значения элемента массива, а не сам элемент. Это означает, что изменяя singleArrayElement в теле цикла, вы не изменяете сам массив.

Однако, если массив содержит объекты (которые мы ещё не проходили), а не простые типы данных, то for-each работает с самим объектом, а не с его копией


Двумерные массивы

До этого мы рассматирвали одномерный массив, но массивы также бывают многомерными.

Представьте одномерный массив, в котором каждый элемент — это полноценный одномерный массив чисел, такой же, как мы рассматривали выше.

То есть это массив массивов чисел, и он называется двумерным массивом.

Ниже приведён пример двумерного массива. Он объявляется с помощью [][]. Как видно, через запятую перечислены массивы чисел — каждый из них является отдельным элементом основного массива.

int[][] b = { {56, 3, 63, 13}, {3,67,2}, {5,5,3,7,9} };
Example

Как же получить доступ к числам подмассивов?

В первой скобочке мы пишем индекс нужного нам подмассива.

Во второй скобочке пишем индекс нужного нам элемента (в нашем случае числа) этого подмассива.

Пример: строка кода ниже достает из массива b число 2. Мы обращаемся ко второму подмасиву, к третьему элементу этого подмассива.

System.out.println(b[1][2]);

Search Icon

Помним что элементы в массивах нумеруются начиная с нуля. Поэтому 1 и 2, а не 2 и 3.

Полный пример:

class Test { public static void main(String []args) { // Ниже пример двумерного массива. // Как видим, через запятую перечислены массивы чисел. int[][] b = { {56, 3, 63, 13}, {3, 67, 2}, {5, 5, 3, 7, 9} }; // Выведем третий элемент во втором подмассиве. System.out.println(b[1][2]); } }

Вывод:


Обход двумерного массива циклом

По двумерному массиву можно пройтись с помощью любого вида цикла, который мы рассматривали ранее. Так как двумерный массив состоит из массивов внутри массива, для его обхода используются вложенные циклы.

Для простоты воспользуемся for-each. Ниже показано, как с помощью вложенных циклов пройтись по всем числам в двумерном массиве и вывести их на консоль.

Пример программы:

class Test { public static void main(String []args) { int[][] b = { {56, 3, 63, 13}, {3, 67, 2}, {5, 5, 3, 7, 9} }; System.out.println(b[1][2]); // Внешний foreach по очереди записывает в single2DSubArray // один из подмассивов двумерного массива b. Таким образом // single2DSubArray перезаписываеться новым подмассивом каждую итерацию. for(int [] single2DSubArray : b){ // Внутренний foreach ниже перебирает числа из текущего подмассива, // который внешним foreach был записан в переменную single2DSubArray. for(int singleArrayNumber : single2DSubArray){ // Через запятую выводим числа подмассива в single2DSubArray System.out.print(singleArrayNumber + “, “); } // После обработки каждого подмассива внутренним for-each // происходит переход на новую строку с помощью \n. // Это позволяет визуально отделить выводимые подмассивы // друг от друга при выводе в консоль. System.out.println(“\n”); } } }

Вывод:

Строки в Java

Работа со строками в Java: конкатенация, обход символов, функции length(), charAt(), equals() и replace(). Практические примеры

Time to read: 8

Функции в Java

Изучите создание и использование функций (методов) в Java: параметры, возвращаемые значения, практический пример. Уменьшаем дублирование кода.

Time to read: 12

Область видимости в Java

Узнайте, как работает область видимости переменных в Java. Примеры области видимости блоков if, for и switch и других.

Time to read: 5