Массив - это объект-контейнер, который содержит фиксированное количество значений одного типа. Длина массива устанавливается при создании массива. После создания его длина фиксируется. Вы уже видели пример массивов в main методе приложения "Hello World!". В этом разделе массивы рассматриваются более подробно.
Массив из 10 элементов.
Каждый элемент в массиве называется элементом, и доступ к каждому элементу осуществляется по его числовому индексу. Как показано на предыдущем рисунке, нумерация начинается с 0. Таким образом, доступ к 9-му элементу, например, будет осуществляться по индексу 8.
Следующая программа, ArrayDemo создает массив целых чисел, помещает в массив некоторые значения и выводит каждое значение в стандартный вывод.
класс ArrayDemo {
public static void main(String[] args) {
// объявляет массив целых чисел
int[] anArray;
// выделяет память для 10 целых чисел
anArray = new int[10];
// инициализирует первый элемент
anArray[0] = 100;
// инициализирует второй элемент
anArray[1] = 200;
// и так далее
anArray[2] = 300;
anArray[3] = 400;
anArray[4] = 500;
anArray[5] = 600;
anArray[6] = 700;
anArray[7] = 800;
anArray[8] = 900;
anArray[9] = 1000;
System.out.println("Элемент с индексом 0: "
+ anArray[0]);
System.out.println ("Элемент с индексом 1: "
+ anArray[1]);
System.out.println("Элемент с индексом 2: "
+ anArray[2]);
System.out.println("Элемент с индексом 3: "
+ anArray[3]);
System.out.println ("Элемент с индексом 4: "
+ anArray[4]);
System.out.println("Элемент с индексом 5: "
+ anArray[5]);
System.out.println("Элемент с индексом 6: "
+ anArray[6]);
System.out.println ("Элемент с индексом 7: "
+ anArray[7]);
System.out.println("Элемент с индексом 8: "
+ anArray[8]);
System.out.println("Элемент с индексом 9: "
+ anArray[9]);
}
}
Результатом работы этой программы является:
Элемент с индексом 0: 100
Элемент с индексом 1: 200
Элемент с индексом 2: 300
Элемент с индексом 3: 400
Элемент с индексом 4: 500
Элемент с индексом 5: 600
Элемент с индексом 6: 700
Элемент с индексом 7: 800
Элемент с индексом 8: 900
Элемент с индексом 9: 1000
В реальной ситуации программирования вы, вероятно, использовали бы одну из поддерживаемых циклических конструкций для перебора каждого элемента массива, а не записывали каждую строку по отдельности, как в предыдущем примере. Однако приведенный пример наглядно иллюстрирует синтаксис массива. Вы узнаете о различных циклических конструкциях (for, while и do-while) в разделе Поток управления.
Объявление переменной для ссылки на массив
Предыдущая программа объявляет массив (с именем anArray) со следующей строкой кода:
// объявляет массив целых чисел
int[] anArray;
Как и объявления переменных других типов, объявление массива состоит из двух компонентов: типа массива и имени массива. Тип массива записывается как type[], где type - тип данных содержащихся элементов; скобки представляют собой специальные символы, указывающие на то, что эта переменная содержит массив. Размер массива не является частью его типа (именно поэтому скобки пусты). Имя массива может быть любым, при условии, что оно соответствует правилам и соглашениям, ранее обсуждавшимся в разделе "Именование". Как и в случае с переменными других типов, объявление фактически не создает массив; оно просто сообщает компилятору, что эта переменная будет содержать массив указанного типа.
Аналогичным образом вы можете объявлять массивы других типов:
byte[] anArrayOfBytes;
short[] anArrayOfShorts;
long[] anArrayOfLongs;
float[] anArrayOfFloats;
double[] anArrayOfDoubles;
boolean[] anArrayOfBooleans;
char[] anArrayOfChars;
String[] anArrayOfStrings;
Вы также можете поместить скобки после имени массива:
// эта форма не рекомендуется использовать
используйте anArrayOfFloats[];
Однако по общепринятым правилам эта форма не рекомендуется; скобки идентифицируют тип массива и должны сопровождаться обозначением типа.
Создание, инициализация массива и доступ к нему
Один из способов создания массива - это использование new оператора. Следующий оператор в ArrayDemo программе выделяет массив с достаточным объемом памяти для 10 целочисленных элементов и присваивает массив anArray переменной.
// создайте массив целых чисел
anArray = new int[10];
Если этот оператор отсутствует, компилятор выдает ошибку, подобную следующей, и компиляция завершается ошибкой:
ArrayDemo.java: 4: Переменная anArray, возможно, не была инициализирована.
Следующие несколько строк присваивают значения каждому элементу массива:
anArray[0] = 100; // инициализируем первый элемент
anArray[1] = 200; // инициализируем второй элемент
anArray[2] = 300; // и так далее
Доступ к каждому элементу массива осуществляется по его числовому индексу:
System.out.println("Элемент 1 с индексом 0: " + anArray[0]);
System.out.println("Элемент 2 с индексом 1: " + anArray[1]);
System.out.println("Элемент 3 с индексом 2: " + anArray[2]);
В качестве альтернативы вы можете использовать синтаксис быстрого доступа для создания и инициализации массива:
int[] anArray = {
100, 200, 300,
400, 500, 600,
700, 800, 900, 1000
};
Здесь длина массива определяется количеством значений, заключенных в фигурные скобки и разделенных запятыми.
Вы также можете объявить массив массивов (также известный как многомерный массив), используя два или более наборов скобок, таких как String[][] names. Следовательно, к каждому элементу должно быть доступно соответствующее количество значений индекса.
В языке программирования Java многомерный массив - это массив, компоненты которого сами являются массивами. Это не похоже на массивы в C или Fortran. Следствием этого является то, что строки могут различаться по длине, как показано в следующей MultiDimArrayDemo программе:
class MultiDimArrayDemo {
public static void main(String[] args) {
String[][] имена = {
{"Мистер", "Миссис", "Мисс"},
{"Смит", "Джонс"}
};
// Мистер Смит
System.out.println(имена[0][0] + имена[1][0]);
// Мисс Джонс
System.out.println(имена[0][2] + имена[1][1]);
}
}
Результатом работы этой программы является:
Мистер Смит
Мисс Джонс
Наконец, вы можете использовать встроенное свойство length для определения размера любого массива. Следующий код выводит размер массива в стандартный вывод:
System.out.println(anArray.length);
Копирование массивов
В System классе есть arraycopy метод, который вы можете использовать для эффективного копирования данных из одного массива в другой:
общедоступная статическая пустая копия массива (Object src, int srcPos,
Object dest, int destPos, int length)
Два Object аргумента определяют массив для копирования из и массив для копирования в. Три int аргумента определяют начальную позицию в исходном массиве, начальную позицию в целевом массиве и количество элементов массива для копирования.
Следующая программа, ArrayCopyDemo объявляет массив String элементов. Он использует System.arraycopy метод для копирования последовательности компонентов массива во второй массив:
class ArrayCopyDemo {
public static void main(String[] args) {
String[] copyFrom = {
"Affogato", "Americano", "Cappuccino", "Corretto", "Cortado",
"Doppio", "Espresso", "Frappucino", "Freddo", "Lungo", "Macchiato",
"Marocchino", "Ristretto" };
String[] CopyTo = новая строка[7];
System.arraycopy(copyFrom, 2, CopyTo, 0, 7);
для (String coffee : CopyTo) {
System.out.print(кофе + " ");
}
}
}
Результатом работы этой программы является:
Cappuccino Corretto Cortado Doppio Espresso Frappucino Freddo
Манипуляции с массивами
Массивы - мощная и полезная концепция, используемая в программировании. Java SE предоставляет методы для выполнения некоторых наиболее распространенных манипуляций, связанных с массивами. Например, в ArrayCopyDemo примере используется arraycopy метод класса System вместо ручного перебора элементов исходного массива и помещения каждого из них в целевой массив. Это выполняется за кулисами, позволяя разработчику использовать всего одну строку кода для вызова метода.
Для вашего удобства Java SE предоставляет несколько методов для выполнения манипуляций с массивами (общие задачи, такие как копирование, сортировка и поиск в массивах) в java.util.Arrays классе. Например, предыдущий пример может быть изменен для использования copyOfRange метода java.util.Arrays класса, как вы можете видеть в ArrayCopyOfDemo примере. Разница в том, что при использовании метода copyOfRange не требуется создавать целевой массив перед вызовом метода, поскольку целевой массив возвращается методом:
класс ArrayCopyOfDemo {
public static void main(String[] args) {
String[] copyFrom = {
"Affogato", "Americano", "Cappuccino", "Corretto", "Cortado",
"Doppio", "Espresso", "Frappucino", "Freddo", "Lungo", "Macchiato",
"Marocchino", "Ristretto" };
String[] CopyTo = java.util.Arrays.copyOfRange(копировать из, 2, 9);
для (String coffee : CopyTo) {
System.out.print(кофе + " ");
}
}
}
Как вы можете видеть, результат этой программы тот же, хотя для нее требуется меньше строк кода. Обратите внимание, что второй параметр copyOfRange метода является начальным индексом диапазона, подлежащего копированию, включительно, в то время как третий параметр является конечным индексом диапазона, подлежащего копированию, исключительно. В этом примере диапазон, подлежащий копированию, не включает элемент массива с индексом 9 (который содержит строку Lungo).
Некоторые другие полезные операции, предоставляемые методами в java.util.Arrays классе::
- Поиск в массиве определенного значения для получения индекса, по которому оно помещено (метод binarySearch).
- Сравнение двух массивов, чтобы определить, равны они или нет (equals метод).
- Заполнение массива для размещения определенного значения в каждом индексе (метод fill).
- Сортировка массива в порядке возрастания. Это можно выполнять либо последовательно, используя sort метод, либо одновременно, используя parallelSort метод, представленный в Java SE 8. Параллельная сортировка больших массивов в многопроцессорных системах выполняется быстрее, чем последовательная сортировка массивов.
- Создание потока, использующего массив в качестве источника (stream метод). Например, следующий оператор выводит содержимое copyTo массива таким же образом, как в предыдущем примере:java.util.Массивы.stream(CopyTo).map(coffee -> кофе + " ").forEach(System.out::печать);
См. раздел Агрегатные операции для получения дополнительной информации о потоках. - Преобразование массива в строку. Метод toString преобразует каждый элемент массива в строку, разделяет их запятыми, затем заключает в квадратные скобки. Например, следующий оператор преобразует copyTo массив в строку и выводит его:System.out.println(java.util.Arrays.toString(CopyTo));
В этом заявлении выводится следующее:[Cappuccino, Corretto, Cortado, Doppio, Espresso, Frappucino, Freddo]