Массивы
Массив — несколько значений под одним именем
Когда нужно хранить не одно значение, а целую последовательность однотипных значений, неудобно создавать отдельную переменную для каждого элемента. Массив объединяет такие значения в одну структуру и позволяет обращаться к каждому элементу по его номеру — индексу.
int[] temperatures = new int[4];
temperatures[0] = 18;
temperatures[1] = 21;
temperatures[2] = 20;
temperatures[3] = 23;
Запись int[] означает «массив значений типа int»,
а new int[4] создаёт массив из четырёх элементов.
Размер массива задаётся при создании и после этого не меняется.
Индексы начинаются с нуля
Первый элемент массива имеет индекс 0, второй — 1 и так далее.
Поэтому у массива из четырёх элементов допустимы индексы от 0 до 3.
Через индекс можно и читать значение, и заменять его.
int[] temperatures = {18, 21, 20, 23};
int first = temperatures[0];
temperatures[2] = 24;
System.out.println(first); // 18
System.out.println(temperatures[2]); // 24
Если обратиться к несуществующему индексу, например temperatures[4],
Java завершит эту операцию с ArrayIndexOutOfBoundsException.
Поэтому при работе с индексами важно учитывать реальную длину массива.
Создание массива с готовыми значениями
Если значения известны заранее, массив можно создать короче — перечислить элементы в фигурных скобках. Java сама определит размер по количеству значений.
int[] scores = {10, 15, 20, 25};
boolean[] answers = {true, false, true};
Если же создать массив только с размером, его элементы получают значения по умолчанию.
Например, элементы int[] начинают с 0,
а элементы boolean[] — с false.
Длина массива и перебор элементов
Количество элементов хранится в length.
Это удобно в цикле: код не зависит от того, сколько элементов находится в конкретном массиве.
int[] scores = {10, 15, 20, 25};
for (int i = 0; i < scores.length; i++) {
System.out.println(scores[i]);
}
length — не метод.
Пиши scores.length, без круглых скобок.
Если индекс не нужен и требуется просто пройти по всем значениям,
можно использовать цикл for-each.
for (int score : scores) {
System.out.println(score);
}
Обычный for удобнее, когда нужен индекс элемента или нужно менять элементы массива.
for-each проще, когда достаточно последовательно прочитать все значения.
Массив можно передать в метод
Массив используется как обычный параметр метода: в типе параметра просто указываются квадратные скобки. Это позволяет написать один метод для обработки массивов разного размера.
static int sum(int[] numbers) {
int result = 0;
for (int number : numbers) {
result += number;
}
return result;
}
Вызов sum(new int[]{2, 4, 6}) вернёт 12.
Сам метод при этом не знает заранее, сколько элементов ему передадут: он получает длину из самого массива.
Несколько измерений
Элементами массива могут быть другие массивы. Так можно представить, например, таблицу, где первый индекс выбирает строку, а второй — элемент внутри этой строки.
int[][] table = {
{1, 2, 3},
{4, 5, 6}
};
System.out.println(table[1][2]); // 6
Здесь table[1] — второй внутренний массив,
а table[1][2] — его третий элемент.
Для начала достаточно воспринимать многомерный массив как массив, внутри которого лежат другие массивы.
new int[4], добавить в него пятый элемент нельзя.
Когда понадобится структура, размер которой удобно менять во время работы программы, мы познакомимся с коллекциями.