Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Модуль 4. Урок 2. Массивы в Java. Введение в Java

Видео может быть заблокировано из-за расширений браузера. В статье вы найдете решение этой проблемы.

Напоминаю, что массив относится к отдельному виду ссылочных типов! Возможно Вам стоит повторить Модуль 2. Урок 2. Типы данных в Java.

Массив - совокупность (последовательность) элементов однородного типа (элементы, которые имеют один и тот же тип).

Это специальный такой тип, который может в себе хранить ссылки на объекты любого другого типа и даже на другие массивы. У этого типа есть, можно так сказать, свой класс-обертка: Arrays. В нем есть много интересных статических методов.

Учить эти документы наизусть не нужно. НО! стоит понимать о чем они и как их найти.

Так как же работают массивы в java?

  • Ссылка на массив обозначается с помощью квадратных скобок [], пример: String[] nameArray; или String nameArray[];(так можно но не рекомендуется). На человеческом языке это значит: "планирую сохранить данные типа String в массиве nameArray". Тип данных, которые будут храниться в массиве - указывать обязательно при объявлении массива.

  • Инициализировать массив означает: дать ссылке адрес конкретного массива в памяти. Например: Object[] myObject = new Object[10];. Именно часть ... new Object[10]; создает сам объект массива в памяти, который в себе уже может содержать объекты. А оператор присвоения = присваивает адрес этого объекта-массива ссылке myObject. При инициализации массива - в памяти создается список ссылок определенного типа. Каждая ссылка может знать адрес конкретного объекта в памяти. Если объект еще не записан в конкретную ячейку массива (не дали ей адрес конкретного объекта в памяти) - то ячейка ссылается на null - в случае с ссылочными типами и на 0 - в случае с числовыми примитивами. alt text Количество пар квадратных скобок [] слева и справа от оператора присвоения = обязательно должно быть строго одинаковым.

  • Необходимо обязательно указать размер создаваемого в памяти массива. В примере выше этот размер равен 10. Но он может быть и больше, пока памяти хватит. Или даже равен 0, это особенная ситуация т.к. массив вроде бы и есть, но ячеек в нём нет. Если же мы зададим размер числом один: Object[] myObject = new Object[1];, то мы получим массив только с одной ячейкой. И адрес у этой ячейки будет [0]. Естественно у массива не может быть отрицательного размера. Размер массива является неизменяемой величиной после инициализации!

  • Если у нас уже есть заранее известное некоторое количество элементов, то массив можно объявить и инициализировать так:

    String[] nameArray = {"Dee", "Max", "Ivan"};
    

    В данном примере перед оператором = объявлена ссылка и тип как обычно, а после, в фигурных скобках, уже перечислены все элементы. java подсчитает их и создаст в памяти массив необходимого размера и типа. Эту же строку можно переписать так:

    String[] nameArray = new String[]{"Dee", "Max", "Ivan"};
    

    В этом примере вызван конструктор (new String[]) но не передан ему размер массива, что не есть правильно. Но за ним сразу следует перечень элементов ({"Dee", "Max", "Ivan"}), из которых компилятор вычислит размер создаваемого массива и добавит их в него. Обратите внимание: применить наполнение массива элементами через фигурные скобки {} можно только в том случае, если нет заданного размера массива в квадратных скобках []. Если же в квадратных скобках задан размер массива - то это значит, что он уже инициализирован: имеет конкретную длину и забит стандартными значениями пустоты для конкретного типа (для String это null, а для int это 0). Можно даже так:

    String x[][] = new String[][]{{"object1"}, {"object3", "object4"}}; // синтаксически правильно
    // но квадратные скобки принято размещать сразу за типом данных, а не за именем ссылки
    

    Это был пример двумерного массива. Или так:

    Object[][] x[][] = new Object[][][][]{{{{}}}}; // синтаксически все правильно, хоть и не культурно
    

    Это был пример четырехмерного массива. Обратите внимание на количество квадратных скобок по обе стороны оператора присвоения. Я об этом писал выше. Рассмотрим многомерные массивы детальнее в этом уроке немного позже.

  • Каждый элемент массива имеет свой индекс (считаем с 0 до n-1). Например заполним некоторые ячейки String массива именами:

    int n = 10;
    String[] nameArray = new String[n];
    nameArray [0] = "Ivan";
    nameArray [1] = "Внезапно"; 
    nameArray [2] = "Carmelita";
    // Каждое из этих имен это объект где-то в памяти компьютера
    nameArray [n-1] = "Some string."; // записываем в последнюю [9]ю ячейку адрес объекта в памяти компьютера
    
  • Массивы в java имеют границу от 0 включительно до n исключительно, где n это заданный размер массива. Если кто-то или что-то пытается обратиться к несуществующей ячейке массива - то гарантировано получает ArrayIndexOutOfBoundsException. Это правило справедливо как для чтения из, так и для записи в массив. Например если мы вдруг забыли как считаются ячейки в массивах и решили получить последний элемент из предыдущего примера вот так:

    String oneName = nameArray[10]; // ошибка, т.к. нет такой ячейки в этом конкретном массиве
    

    То же самое будет при попытке обратиться к ячейке с индексом меньше 0.

Изучив документацию, приведенную выше, - вы узнаете о некоторых членах класса []. Это поможет справиться с дополнительными практическими заданиями и закрепить знания.

массивы имеющие мерность больше 1

Двумерный массив - это массив, который содержит в себе один порядок подмассивов. Пример: int[][] exampleArray = new int[5][2];. Этот массив может быть применен для хранения матрицы размером 5х2. Прочитать этот массив можно так: основной массив размером 5, каждая ячейка которого ссылается на подмассив размером 2, а каждая ячейка каждого из пяти подмассивов предназначена для хранения целого числа (int).

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

Object[][] x = new Object[4][]; // инициализирован только основной массив и каждая его ячейка, пока что, ссылается на null.
// То есть подмассивы отсутствуют.

Инициализируем теперь и вложенные массивы (подмассивы):

x[0] = new Object[4]; // пускай в первой ячейке будет подмассив аналогичен по длине основному массиву 
x[1] = new Object[0]; // во второй пускай будет странный массив с нулем ячеек
x[2] = new Object[999995]; // в третьей ячейке пускай будет побольше массив, на 999 995 ячеек
x[3] = null; // по сути в этой строке мы никак не изменили четвертую ячейку основного массива - она уже ссылалась на null

Визуальный пример:

enter image description here

Трехмерный массив - это массив, который содержит в себе два порядка подмассивов. Пример int[][][] exampleArray = new int[][][];. С помощью такого массива можно описать, например, некий куб. В данном примере мы имеем основной массив, который содержит в себе подмассивы, а те, в свою очередь, тоже содержат подмассивы, которые уже и будут хранить в себе конкретные данные или ссылки на объекты.

Многомерный массив - это массив, который содержит в себе n-1 порядков вложенных массивов. Например в четырехмерном массиве будет три порядка вложенных массивов и только в третьем уже будут непосредственно сохранятся данные.

На практике чаще всего приходится применять массивы размерностью 1 или 2.

P.S. Экспериментируйте с кодом и допускайте ошибки уже сейчас, а не на продакшене. )


Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты.

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»