Главная » Java » Массивы в Java

0

Массивы (arrays) _ это упорядоченные наборы элементов одного типа. Элементами массива могут служить объекты простых и ссылочных типов, в том Числе и ссылки на другие массивы. Массивы сами по себе являются объектами и

наследуют класс Object. Объявление

int[] ia = new int[3];

Определяет массив с именем ia, который изначально указывает на набор из трех Элементов типа int.

В объявлении массива его размерность не указывается. Количество элементов массива задается при его создании посредством оператора new. Длина массива фиксируется в момент создания и в дальнейшем изменению не поддается. Впрочем, переменной типа массива (в нашем примере – ia) в любой момент может быть поставлен в соответствие новый массив с другой размерностью.

Доступ к элементам массива осуществляется по значениям их номеров-индексов.

Первый элемент массива имеет индекс, равный нулю (0), а последний – length – 1. Обращение к элементу массива выполняется посредством задания имени массива и значения индекса, заключенного в квадратные скобки, [ и ]. в предыдущем примере первым элементом массива ia будет ia[0], а последним – ia[2]. При каждом обращении к элементу массива по индексу исполняющая система Java проверяет, находится ли значение индекса в допустимых пределах, и генерирует исключение типа ArraylndexOutOfBoundsException, если результат проверки ложен.6 Выражение индекса должно относиться к типу int – только этим и ограничивается максимальное количество элементов массива.

Длину массива легко определить с помощью поля length объекта массива (которое неявно снабжено признаками publiс и final). Ниже приведен дополненный код прежнего примера, в котором предусмотрено выполнение Цикла, обеспечивающего вывод на экран содержимого каждого элемента массива ia:

for (int i = о; i < ia.length; i++)

 system.out.println(i + ": " + ia[i]);

Массив нулевой длины (т.е. такой, в котором нет элементов) принято называть пустым. Обратите внимание, что ссылка на массив, равная значению null, и ссылка на пустой массив – это совершенно разные вещи. Пустой массив это реальный массив, в котором попросту отсутствуют элементы. Пустой массив представляет собой удобную альтернативу значению null при возврате из метода. Если метод способен возвращать null, прикладной код, в котором выполняется обращение к методу, должен сравнить возвращенное значение с null прежде, чем перейти к выполнению оставшихся операций. Если же метод возвращает массив (возможно, пустой), никакие дополнительные проверки не нужны – разумеется, помимо тех, которые касаются длины массива и должны выполняться в любом случае.

Допускается и иная форма объявления массива, в которой квадратные скобки задаются после идентификатора массива, а не после наименования его типа:

int ia[] = new int[3];

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

Модификаторы в объявлениях массивов

Правила употребления в объявлениях массивов тех или иных модификаторов обычны и зависят только от того, к какой категории относится массив – к полям или Локальным переменным. Существует единственная особенность, которую важно помнить, – модификаторы применяются к массиву как таковому, но не к его отдельным элементам. Если в объявлении массива указан признак final, это значит только то, что ссылка на массив не может быть изменена после его создания, но никак не запрещает возможность изменения содержимого отдельных элементов массива. Язык не позволяет задавать каких бы то ни было модификаторов (скажем, final или уоlatilе) для элементов массива.

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

В Java поддерживается возможность объявления многомерных массивов (multidimensional arrays) (т.е. массивов, элементами которых служат другие массивы), Код, предусматривающий объявление двумерной матрицы и вывод на экран содержимого ее элементов, может выглядеть, например, так:

float[][] mat = new float[4][4];

 setupMatrix(mat);

for (int у = о; у < mat.length; у++) {

for (int х = о; х < mat[y].length; х++)

 system.out.print(mat[y][x] + " ");

system.out.println();

}

При создании массива должна быть указана, по меньшей мере, его первая, "самая левая", размерность. Другие размерности разрешается не задавать – в этом случае их придется определить позже. Указание в операторе new единовременно всех размерностей – это самый лаконичный способ создания массива, позволяющий избежать необходимости использования дополнительных операторов new. Выражение объявления и создания массива mat, приведенное выше, равнозначно следующему фрагменту кода:

float[][] mat = new float[4][];

for (int у = о; у < mat.length; у++)

 mat[y] = new float[4];

Такая форма объявления обладает тем преимуществом, что позволяет наряду с получением массивов с одинаковыми размерностями (скажем, 4х4) строить и массивы массивов различных размерностей, необходимых для хранения тех или иных последовательностей данных.

Инициализация массивов

При создании массива каждый его элемент получает значение, предусмотренное по умолчанию и зависящее от типа массива: нуль (0) – для числовых типов, ‘\u0000′ _ для char, false – для boolean и null – для ссылочных типов. Объявляя массив ссылочного типа, мы на самом деле определяем массив переменных этого типа. Рассмотрим следующий фрагмент кода:

Attr[] attrs = new Attr[12];

for (int i = о; i < attrs.length; i++)

attrs[i] = new Attr(names[i], values[i]);

После выполнения первого выражения, содержащего оператор new, переменная attrs получит ссылку на массив из 12 переменных, которые инициализированы значением null, Объекты Attr как таковые будут созданы только в процессе про хождения цикла.

Массив может инициализироваться (одновременно с объявлением) посредством конструкции в фигурных скобках, в которой перечислены исходные Значения его элементов:

String[] dangers = { "Львы", "Тигры", "Медведи" };

Следующий фрагмент кода даст тот же результат:

String[] dangers = new String[3]; dangers[0] = "Львы";

dangers[1] = "Тигры";

dangers [2] = "Медведи";

Первая форма, предусматривающая задание списка инициализаторов в фигурных скобках, не требует явного использования оператора new – он вызывается косвенно исполняющей системой. Длина массива в этом случае определяется Количеством значений-инициализаторов. Допускается и возможность явного задания оператора new, но размерность все равно следует опускать  она, как и раньше, определяется исполняющей системой:

String[] dangers = new String[] { "Львы", "Тигры", "Медведи" };

 Подобную форму объявления и инициализации массива разрешается применять в любом месте кода, например в выражении вызова метода:

printStringsCnew String[] { "раз", "два", "три" });

Массив без названия, который создается таким образом, называют анонимным (anonymous).

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

int[][] pascalsTriangle = {

{ 1 },

{ 1, 1 },

{ 1, 2, 1 },

{ 1, 3, 3, 1 },

{ 1, 4, 6, 4, 1 },

};

Индексы многомерных массивов следуют в порядке от внешнего к внутренним. Так, например, pascalsTriangle[OJ ссылается на массив значений типа int, содержащий один элемент, pascalsTrianglе[1] указывает на массив с двумя элементами и Т.д.

Класс System содержит удобный метод аггаусору, который позволяет присваивать значения элементов одного массива другому, избегая необходимости Использования вложенных циклов (за подробностями обращайтесь к разделу 18.1.3 на странице 499).

Массивы и типы

Все массивы неявно наследуют класс Object. Пусть даны класс Х и классы У и Z, Производные от х, а также массивы значений этих типов. Иерархию таких классов можно представить следующим образом.

Массивы поддерживают механизм полиморфизма. Массив при необходимости можно присвоить переменной типа Object, а затем выполнить обратное преобразование. Массив объектов типа у допускается использовать в контексте, требующем задания массива объектов базового типа х. Это выглядит вполне естественным, но может требовать дополнительных проверок во время выполнения кода. Массив объектов Х способен содержать ссылки на объекты Y и Z, но элементам массива объектов у нельзя присваивать ссылки на объекты Х или Z. При выполнении двух последних строк следующего фрагмента кода, нарушающих указанное правило, будет сгенерировано исключение типа ArrayStoreException:

     У[] уАггау = new Y[3];                 // Массив объектов у

     х[] XАrrау = уАггау;                      // X допускает присваивание Y

XАrrау[0] = new Y();

     XАrrау[1] = new X();                            // НЕВЕРНО: X нельзя сохранить в Y

     XАrrау[2] = new Z();                              // НЕВЕРНО: Z нельзя сохранить в Y

Если бы в переменной XАrrау хранилась ссылка на фактический объект X[], присваивание элементам массива XАrrау объектов классов Х и Z было бы корректным. Но xАrrау в действительности указывает на объект Y[], поэтому подобные операции присваивания недопустимы. В таких случаях правильность операций проверяется на этапе выполнения программы.

Созданные массивы, подобно другим объектам, уничтожаются с помощью механизма сборки мусора. Они наследуют все методы класса Object и дополнительно реализуют интерфейс Cloneablе (см. раздел 3.9 на странице 111).

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

class ScaleVector extends double[] { // НЕВЕРНО!

}

В этом смысле массивы подобны классам, обозначенным как final.

Упражнение 6.1, Напишите программу расчета треугольника Паскаля до глубины 12, предусматривающую хранение каждой строки элементов в виде массива соответствующей длины и размещение массивов строк в массиве типа int с 12-ю элементами. Обеспечьте возможность вывода значений элементов на Экран с помощью метода, который оперирует фактическими длинами каждого из Вложенных массивов и "внешнего" массива, а не константой 12. Измените код, не исправляя текст метода, чтобы программа вычисляла треугольник Паскаля Другой размерности.

Источник: Арнолд, Кен, Гослинг, Джеймс, Холмс, Дэвид. Язык программирования Java. 3-е изд .. : Пер. с англ. – М. : Издательский дом «Вильяме», 2001. – 624 с. : ил. – Парал. тит. англ.

По теме:

  • Комментарии