> For the complete documentation index, see [llms.txt](https://letas-organization.gitbook.io/letaats-lessons-online/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://letas-organization.gitbook.io/letaats-lessons-online/kolledzh-top/razdel-1/glava-10.-massivy-khranenie-naborov-dannykh.md).

# Глава 10. Массивы: хранение наборов данных

### 10.1. Зачем нужны массивы

Представьте, что нужно хранить оценки пяти студентов.

Можно написать так:

```java
int grade1 = 5;
int grade2 = 4;
int grade3 = 3;
int grade4 = 5;
int grade5 = 4;
```

А если студентов 30?

```java
int grade1;
int grade2;
int grade3;
...
int grade30;
```

Код быстро превращается в склад однотипных переменных. Как обычно, человек сначала создаёт хаос, потом придумывает инструмент для борьбы с ним.

Массив позволяет хранить много значений одного типа под одним именем.

```java
int[] grades = {5, 4, 3, 5, 4};
```

***

### 10.2. Что такое массив

Массив — это структура данных, которая хранит набор элементов одного типа.

Пример:

```java
int[] numbers = {10, 20, 30};
```

Здесь:

* `int[]` — массив целых чисел;
* `numbers` — имя массива;
* `{10, 20, 30}` — элементы массива.

***

### 10.3. Индексы

Каждый элемент массива имеет индекс.

```java
int[] numbers = {10, 20, 30};
```

Индексы:

```
индекс:    0   1   2
значение: 10  20  30
```

Первый элемент:

```java
numbers[0]
```

Второй элемент:

```java
numbers[1]
```

Третий элемент:

```java
numbers[2]
```

***

### 10.4. Почему индексы начинаются с 0

На начальном уровне можно запомнить так:

```
первый элемент массива имеет индекс 0
```

Исторически это связано с тем, что индекс показывает смещение от начала массива.

Нулевой элемент находится в начале, то есть смещение равно 0.

***

### 10.5. Создание массива с известными значениями

```java
int[] numbers = {1, 2, 3, 4, 5};
```

***

### 10.6. Создание пустого массива заданного размера

```java
int[] numbers = new int[5];
```

Создаётся массив из 5 элементов.

Изначально все значения равны 0:

```
[0, 0, 0, 0, 0]
```

***

### 10.7. Значения по умолчанию

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

| Тип массива     | Значение по умолчанию |
| --------------- | --------------------- |
| `int[]`         | `0`                   |
| `double[]`      | `0.0`                 |
| `boolean[]`     | `false`               |
| `String[]`      | `null`                |
| массив объектов | `null`                |

Пример:

```java
String[] names = new String[3];
System.out.println(names[0]);
```

Результат:

```
null
```

***

### 10.8. Заполнение массива вручную

```java
int[] numbers = new int[3];

numbers[0] = 10;
numbers[1] = 20;
numbers[2] = 30;
```

***

### 10.9. Заполнение массива через Scanner

```java
Scanner scanner = new Scanner(System.in);

int[] numbers = new int[5];

for (int i = 0; i < numbers.length; i++) {
    System.out.print("Введите число: ");
    numbers[i] = scanner.nextInt();
}
```

Цикл проходит по всем индексам массива и записывает значения.

***

### 10.10. Длина массива

```java
numbers.length
```

Важно:

```java
length
```

у массива — это поле, а не метод. Скобки не нужны.

Правильно:

```java
numbers.length
```

Неправильно:

```java
numbers.length()
```

***

### 10.11. Последний элемент массива

Если длина массива 5, индексы:

```
0, 1, 2, 3, 4
```

Последний индекс:

```java
numbers.length - 1
```

Последний элемент:

```java
numbers[numbers.length - 1]
```

***

### 10.12. Перебор массива

```java
for (int i = 0; i < numbers.length; i++) {
    System.out.println(numbers[i]);
}
```

Это стандартный способ пройти по всем элементам массива.

***

### 10.13. Enhanced for

Можно использовать цикл “для каждого элемента”.

```java
for (int number : numbers) {
    System.out.println(number);
}
```

Так проще, если не нужен индекс.

Если индекс нужен, используйте обычный `for`.

***

### 10.14. Сумма элементов массива

```java
int sum = 0;

for (int i = 0; i < numbers.length; i++) {
    sum += numbers[i];
}

System.out.println(sum);
```

***

### 10.15. Среднее значение

```java
int sum = 0;

for (int i = 0; i < numbers.length; i++) {
    sum += numbers[i];
}

double average = (double) sum / numbers.length;

System.out.println(average);
```

Важно:

```java
(double) sum
```

нужно, чтобы получить дробный результат.

***

### 10.16. Поиск максимума

```java
int max = numbers[0];

for (int i = 1; i < numbers.length; i++) {
    if (numbers[i] > max) {
        max = numbers[i];
    }
}
```

Почему начинаем с `numbers[0]`, а не с 0?

Потому что массив может быть таким:

```
-10, -5, -20
```

Если взять `max = 0`, результат будет неправильным.

***

### 10.17. Поиск минимума

```java
int min = numbers[0];

for (int i = 1; i < numbers.length; i++) {
    if (numbers[i] < min) {
        min = numbers[i];
    }
}
```

***

### 10.18. Подсчёт элементов по условию

Например, нужно посчитать количество чётных чисел.

```java
int count = 0;

for (int i = 0; i < numbers.length; i++) {
    if (numbers[i] % 2 == 0) {
        count++;
    }
}
```

***

### 10.19. Поиск элемента

Задача: проверить, есть ли в массиве число 10.

```java
boolean found = false;

for (int i = 0; i < numbers.length; i++) {
    if (numbers[i] == 10) {
        found = true;
        break;
    }
}

if (found) {
    System.out.println("Число найдено");
} else {
    System.out.println("Число не найдено");
}
```

***

### 10.20. Массив строк

```java
String[] names = {"Anna", "Max", "Leo"};

for (int i = 0; i < names.length; i++) {
    System.out.println(names[i]);
}
```

Сравнение строк:

```java
if (names[i].equals("Anna")) {
    System.out.println("Найдена Anna");
}
```

***

### 10.21. Массив boolean

```java
boolean[] completed = new boolean[5];

completed[0] = true;
completed[1] = false;
```

Так можно хранить, выполнены ли задачи.

***

### 10.22. Массив объектов

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

```java
Student[] students = new Student[3];
```

Изначально элементы равны `null`.

Нужно создать объекты:

```java
students[0] = new Student("Anna", 18);
students[1] = new Student("Max", 19);
```

Ошибка:

```java
System.out.println(students[0].name);
```

если `students[0] == null`.

***

### 10.23. Массивы в Android

В Android массивы можно использовать, например, для хранения:

* вариантов ответов;
* текстов советов;
* вопросов викторины;
* картинок;
* простых данных приложения.

Пример генератора случайных фраз:

```java
String[] phrases = {
    "Учите Java",
    "Проверьте код",
    "Не забывайте точку с запятой"
};
```

При нажатии кнопки можно выбрать случайную фразу и показать её в `TextView`.

***

### 10.24. Типичные ошибки новичков

#### Ошибка 1. Выйти за границы массива

```java
int[] numbers = {1, 2, 3};

System.out.println(numbers[3]);
```

Ошибка: индексы только `0`, `1`, `2`.

***

#### Ошибка 2. Использовать `<=`

```java
for (int i = 0; i <= numbers.length; i++)
```

Правильно:

```java
for (int i = 0; i < numbers.length; i++)
```

***

#### Ошибка 3. Использовать массив объектов без создания объектов

```java
Student[] students = new Student[3];
System.out.println(students[0].name);
```

Ошибка: `students[0]` равен `null`.

***

#### Ошибка 4. Считать среднее как int

```java
double avg = sum / numbers.length;
```

Если `sum` и `length` — целые числа, дробная часть потеряется.

Правильно:

```java
double avg = (double) sum / numbers.length;
```

***

### 10.25. Как могут спросить на экзамене

#### Вопрос

Что такое массив?

#### Хороший ответ

> Массив — это структура данных, которая хранит набор элементов одного типа. Каждый элемент имеет индекс, начиная с 0. Длина массива доступна через `length`.

***

#### Вопрос

Как обратиться к последнему элементу массива?

#### Хороший ответ

> Нужно использовать индекс `array.length - 1`, потому что индексация начинается с 0.

***

#### Вопрос

Что произойдёт при выходе за границы массива?

#### Хороший ответ

> Возникнет ошибка `ArrayIndexOutOfBoundsException`, потому что программа пытается обратиться к индексу, которого в массиве нет.

***

### 10.26. Практические задания

#### Задание 1

Создайте массив из 5 чисел и выведите все элементы.

***

#### Задание 2

Заполните массив из 5 чисел через Scanner.

***

#### Задание 3

Найдите сумму элементов массива.

***

#### Задание 4

Найдите среднее значение массива.

***

#### Задание 5

Найдите максимальный и минимальный элемент массива.

***

#### Задание 6

Посчитайте количество положительных чисел в массиве.

***

#### Задание 7

Проверьте, есть ли в массиве число, введённое пользователем.

***

#### Задание 8

Создайте массив строк с названиями книг. Найдите самую длинную строку.

***

### 10.27. Вопросы для самопроверки

1. Что такое массив?
2. Почему элементы массива одного типа?
3. Что такое индекс?
4. Почему первый индекс равен 0?
5. Как получить длину массива?
6. Как обратиться к последнему элементу?
7. Как перебрать массив через `for`?
8. Как найти сумму элементов?
9. Почему максимум лучше начинать с первого элемента?
10. Что такое `ArrayIndexOutOfBoundsException`?
11. Что хранится в массиве `String[]` по умолчанию?
12. Где массивы могут использоваться в Android?
