Глава 6. Работа со строками ← Вернуться к списку глав Глава 8. Объектно-ориентированное программирование (ООП)

Глава 7. Массивы и коллекции

Ниже приведена подробная седьмая глава, ориентированная на новичков без опыта в программировании. В предыдущих главах мы разобрались с основами синтаксиса Java, научились писать методы, работать со строками. Теперь пришло время научиться обрабатывать сразу много элементов, а не только один. Для этого нам нужны массивы и коллекции.


7.1 Зачем нужны массивы и коллекции?

Представьте, что вам надо хранить не одно число, а список из 10 чисел. Вы могли бы создать 10 переменных: int num1, num2, num3, ... num10; Но это неудобно — громоздко и тяжело менять размер списка.

Чтобы упростить жизнь, в Java есть структуры данных для хранения наборов элементов:

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

Массив — это контейнер, который может хранить сразу несколько значений одного типа. Элементы массива нумеруются с 0.

Пример массива целых чисел (int):

int[] numbers = new int[5]; 

Эта строка создала массив numbers из 5 элементов, каждый элемент — целое число (int). Пока мы не присвоили им значения, элементы массива по умолчанию равны 0.

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

Существует несколько способов задать значения массива:

  1. Присвоение значений по индексам:

    int[] numbers = new int[5];
    numbers[0] = 10; // первый элемент
    numbers[1] = 20; 
    numbers[2] = 30; 
    numbers[3] = 40; 
    numbers[4] = 50; // пятый элемент
    
  2. Сразу при объявлении:

    int[] numbers = {10, 20, 30, 40, 50};
    

    Здесь массив сразу инициализирован значениями 10, 20, 30, 40, 50.

7.4 Доступ к элементам массива

Чтобы получить или изменить элемент массива, укажите его индекс в квадратных скобках:

int[] numbers = {10, 20, 30, 40, 50};
System.out.println(numbers[0]); // выведет 10
numbers[2] = 99; // теперь третий элемент массива — 99, массив: [10, 20, 99, 40, 50]

Помните, что индексы в Java начинаются с 0. Для массива из 5 элементов индексы будут 0,1,2,3,4. Если вы попытаетесь обратиться к несуществующему индексу (например numbers[5]), будет ошибка ArrayIndexOutOfBoundsException.

7.5 Длина массива

Число элементов массива хранится в его поле length:

int[] numbers = {10, 20, 30, 40, 50};
int length = numbers.length; // length = 5

Полезно использовать length для прохода по всем элементам массива в цикле:

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

Этот цикл выведет все элементы массива.

7.6 Цикл "for-each" для массивов

Есть удобный цикл, чтобы пройтись по всем элементам массива, не заботясь об индексах:

int[] numbers = {10, 20, 30, 40, 50};
for (int num : numbers) {
    System.out.println(num);
}

Здесь num последовательно принимает значение каждого элемента массива.

7.7 Двумерные массивы

Массивы могут быть многомерными. Например, двумерный массив — это массив массивов, напоминает таблицу.

int[][] matrix = {
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9}
};

Доступ к элементам:

System.out.println(matrix[1][2]); // второй ряд, третий столбец, выведет 6

Можно использовать вложенные циклы для прохода по всем элементам:

for (int i = 0; i < matrix.length; i++) {
    for (int j = 0; j < matrix[i].length; j++) {
        System.out.print(matrix[i][j] + " ");
    }
    System.out.println();
}

7.8 Что такое коллекции?

Массивы — хорошая штука, но их размер фиксирован. Если вы создали массив из 5 элементов, вы не можете динамически добавить шестой элемент без создания нового массива.

Для более гибкого управления наборами данных существуют коллекции. Одна из самых простых и популярных коллекций — ArrayList.

ArrayList позволяет:

Чтобы использовать ArrayList, нужно импортировать:

import java.util.ArrayList;

7.9 Создание ArrayList

Пример создания ArrayList для хранения строк:

ArrayList<String> names = new ArrayList<>();
names.add("Аня");
names.add("Борис");
names.add("Вика");
System.out.println("Размер списка: " + names.size()); // размер: 3

Здесь String в угловых скобках означает, что это список строк. Вы можете использовать любой ссылочный тип данных, в том числе классы-обёртки для примитивов (например, Integer для int).

7.10 Доступ к элементам ArrayList

ArrayList<String> names = new ArrayList<>();
names.add("Аня");
names.add("Борис");

// Получить элемент по индексу
String firstName = names.get(0); // "Аня"
System.out.println(firstName);

// Изменить элемент
names.set(1, "Влад"); // теперь список: ["Аня", "Влад"]

Размер списка (количество элементов) можно узнать через names.size().

7.11 Перебор ArrayList

Можно использовать обычный цикл for с индексом:

for (int i = 0; i < names.size(); i++) {
    System.out.println(names.get(i));
}

Или цикл for-each:

for (String name : names) {
    System.out.println(name);
}

7.12 Удаление элементов из ArrayList

Вы можете удалить элемент по индексу или по значению:

names.remove(0); // удалит элемент с индексом 0 ("Аня"), теперь список: ["Влад"]

names.add("Галя");
names.remove("Влад"); // удалит "Влад" по значению, теперь ["Галя"]

7.13 Почему использовать ArrayList?

ArrayList удобен, когда вам не известен точный размер набора данных заранее, или когда нужно часто добавлять/удалять элементы. Например, если вы пишете программу для хранения списка покупок, пользователю проще добавлять элементы в ArrayList, чем заботиться о размерах массивов.

7.14 Сводка: массивы vs ArrayList

Для начала чаще будут пригодны массивы, когда вы знаете размер данных заранее, и ArrayList — когда нужно гибкое изменение набора элементов.

7.15 Пример: программа с массивом и ArrayList

Пример использования массива: у нас есть 5 оценок студентов, и мы хотим вычислить среднее:

int[] grades = {5, 4, 5, 3, 4};
int sum = 0;
for (int grade : grades) {
    sum += grade;
}
double avg = (double) sum / grades.length;
System.out.println("Средняя оценка: " + avg);

Пример с ArrayList: создадим список покупок и выведем его:

import java.util.ArrayList;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        ArrayList<String> shoppingList = new ArrayList<>();
        Scanner scanner = new Scanner(System.in);

        System.out.println("Введите товары (пустая строка для выхода):");
        while (true) {
            String item = scanner.nextLine();
            if (item.isEmpty()) {
                break; // остановка, если строка пустая
            }
            shoppingList.add(item);
        }

        System.out.println("Ваш список покупок:");
        for (String product : shoppingList) {
            System.out.println("- " + product);
        }
    }
}

Здесь пользователь может вводить сколько угодно товаров, список будет расширяться по необходимости.

7.16 Подводим итоги

В этой главе мы:

В следующих главах мы продолжим знакомство с более сложными структурами данных и перейдём к объектно-ориентированному программированию, чтобы ещё лучше структурировать ваш код.


На этом мы завершаем седьмую главу. В следующей главе мы поговорим о принципах объектно-ориентированного программирования (ООП), которые являются фундаментом современных приложений на Java и помогут вам создавать более масштабируемые и понятные программы.

Глава 6. Работа со строками ← Вернуться к списку глав Глава 8. Объектно-ориентированное программирование (ООП)

Просмотров: 65