1. Введение
Это первая лекция бонусного уровня. Мы уже вплотную приблизились к изучению ООП. И я хочу подогреть ваш интерес и немного забежать наперёд 😈. В текущем уровне я расскажу вам о 5 интересных вещах:
- ♾️ Вы научитесь создавать бесконечные массивы
- 📖 Затем вести "персональный словарь"
- 💾 После этого я совсем немного познакомлю вас с работой с файлами
- 🌐 Потом мы научимся скачивать картинки из интернета
- 🛰️ А в последней лекции уровня вы будете следить за космической станцией МКС в реальном времени
Как это всё работает под капотом, вы узнаете в будущих уровнях, ну а сегодня вы просто научитесь пользоваться предоставленными мной инструментами. Заинтриговал? Тогда начнём 😇.
Вспоминаем обычные массивы
Давайте вспомним обычный массив в Java:
int[] arr = new int[10];
Отличная штука, но есть у него пара ограничений: размер фиксирован, добавить или убрать элемент нельзя, если не создавать новый массив. А ведь иногда хочется массив, который растёт и уменьшается по мере необходимости. И у нас есть отличное решение — динамический массив ArrayList!
ArrayList — это «умный массив», который может расти и уменьшаться автоматически. В отличие от обычного массива, где размер фиксирован, ArrayList сам заботится о том, чтобы в нём хватило места для новых элементов.
Создаём бесконечный массив
Чтобы создать наш ArrayList, нужно написать код вида:
ArrayList<String> array = new ArrayList<String>()
После этого в него можно добавлять элементы:
array.add("Маша");
array.add("Катя");
Создаём динамический массив для целых чисел
Как вы уже, возможно, догадались, тип элементов нашего динамического массива нужно указывать в треугольных скобках. Там можно указать любой тип, кроме примитивных типов. Примитивные типы придётся заменить на их типы-обёртки.
Пример:
ArrayList<Integer> numbers = new ArrayList<Integer>(); // int
ArrayList<Double> fees = new ArrayList<Double>(); // double
ArrayList<Boolean> yesList = new ArrayList<Boolean>(); // boolean
ArrayList<Character> chars = new ArrayList<Character>(); // char
Наш ArrayList не поддерживает [index] для обращения к элементам, но у него есть специальные методы, которые покрывают все ваши потребности. Давайте пройдёмся по самым интересным.
2. Метод add(element) — добавление элемента
Первое, что мы делаем со списком, — добавляем в него данные. Для этого служит метод add. Он кладёт элемент в конец списка.
ArrayList<String> todo = new ArrayList<>(); // список дел
todo.add("Выучить ArrayList");
todo.add("Сделать чай");
todo.add("Погулять");
После этих трёх строк у нас есть список из трёх строк. В отличие от массива, нам не нужно заранее указывать размер — он растёт сам по мере добавления.
Очень удобно: можно начинать с пустого списка и постепенно его наполнять в зависимости от действий пользователя или входных данных программы.
3. Метод get(index) — доступ по индексу
Каждый элемент списка имеет свой порядковый номер — индекс. Индексация всегда начинается с нуля. То есть первый элемент находится под номером 0, второй под номером 1 и так далее.
Если мы хотим получить элемент по номеру, используем метод get.
String task = todo.get(1);
System.out.println("Второе дело: " + task);
Вывод:
Второе дело: Сделать чай
Важно запомнить: если обратиться к индексу, которого нет (например, todo.get(10) при списке из трёх элементов), программа выдаст ошибку IndexOutOfBoundsException. Поэтому всегда нужно либо быть уверенным в индексе, либо проверять размер списка через size().
4. Метод set(index, element) — замена элемента
Бывает, что элемент в списке нужно заменить. В этом случае не нужно удалять и заново добавлять — достаточно использовать метод set.
todo.set(1, "Сварить кофе");
System.out.println("Теперь второе дело: " + todo.get(1));
Вывод:
Теперь второе дело: Сварить кофе
Таким образом, set — это способ обновить список «на лету».
5. Метод remove(index) — удаление элемента
Удалить элемент из ArrayList можно по индексу.
todo.remove(0);
System.out.println("Первое дело теперь: " + todo.get(0));
Вывод:
Первое дело теперь: Сварить кофе
Мы удалили первый элемент (индекс 0). И теперь второй стал первым, а вторым элементом стал тот, что раньше был третьим. Важный момент: после удаления элементы списка сдвигаются.
Это иногда может быть неожиданностью для новичков. Всегда учитывайте, что после удаления индексы пересчитываются.
6. Метод size() — узнать размер списка
Метод size возвращает количество элементов в списке. Это похоже на свойство length у массивов, но у ArrayList — это метод.
System.out.println("Всего дел: " + todo.size());
Вывод:
Всего дел: 2
Часто size используется в циклах, чтобы перебрать все элементы:
for (int i = 0; i < todo.size(); i++)
{
System.out.println(todo.get(i));
}
7. Метод contains(element) — проверка наличия
Чтобы узнать, есть ли в списке нужный элемент, можно воспользоваться contains. Этот метод возвращает true или false.
System.out.println(todo.contains("Погулять"));
System.out.println(todo.contains("Сделать чай"));
Вывод:
true
false
Очень полезный метод, когда вы хотите избежать дубликатов или проверить условие «есть ли такой элемент в списке».
8. Перебор элементов
Есть два способа пройтись по списку.
Индексный цикл
Этот способ нужен, если вам важен номер элемента.
for (int i = 0; i < todo.size(); i++)
{
System.out.println(i + ": " + todo.get(i));
}
Цикл for-each
А если номер не нужен, а вы просто хотите посмотреть все элементы — используйте цикл for-each.
for (String task : todo)
{
System.out.println("Дело: " + task);
}
Такой цикл короче и читается проще.
9. Практика: ArrayList в вашем приложении
Сделаем список дел, который можно пополнять и выводить:
import java.util.ArrayList;
import java.util.Scanner;
public class TodoApp
{
public static void main(String[] args)
{
ArrayList<String> todo = new ArrayList<>();
Scanner console = new Scanner(System.in);
while (true)
{
System.out.print("Введите дело (или пустую строку для выхода): ");
String task = console.nextLine();
if (task.isEmpty()) break;
todo.add(task);
}
System.out.println("Ваш список дел:");
for (int i = 0; i < todo.size(); i++)
{
System.out.println((i + 1) + ". " + todo.get(i));
}
}
}
Надеюсь, вам понравился наш бесконечный массив. Он — первая из Java-коллекций, с которой вы познакомились. Я думаю, остальные вам тоже понравятся.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ