1. Класс ArrayList

Сегодня мы изучим класс ArrayList. Это первый класс из так называемых коллекций. Коллекции в Java — настолько обширная и полезная вещь, что ей посвящен целый квест на JavaRush.

Чтобы полностью понять, как устроены коллекции и все нюансы их работы, нужно сначала изучить ООП, интерфейсы, наследование, азы многопоточности и многое другое.

Поэтому сегодня мы просто познакомимся с самой простой коллекцией. Зато на достаточно глубоком уровне, чтобы вы понимали, как ей пользоваться и как она работает. Итак, встречайте: коллекция ArrayList.

Предыстория

Начну с небольшой предыстории. Программистам очень не нравилось одно свойство массива — его размер нельзя изменять. Что делать, если нужно сохранить в массиве ещё три элемента, а свободное место только одно?

Единственным решением проблемы нехватки места в массиве было создание массива очень большого размера, чтобы все элементы туда точно поместились. Но это часто приводило к нерациональному расходу памяти. Если обычно в массиве хранилось два-три элемента, но был хотя бы мизерный шанс, что там их будет 100, приходилось создавать массив на 100 элементов.

И что же придумали программисты? Они написали класс ArrayList (массив-список), который выполнял ту же работу, что и Array (массив), но мог изменять свой размер.

Класс ArrayList

Само название ArrayList происходит из двух слов: Array + List. Array — это массив, а List — список.

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

У класса ArrayList отсутствуют все недостатки, которые есть у массивов. Он умеет:

  • Хранить элементы определенного типа
  • Динамически менять размер списка
  • Добавлять элементы в конец списка
  • Вставлять элементы в начало и середину списка
  • Удалять элементы из любого места списка

Подробнее — ниже:


2. Создание объекта ArrayList

Чтобы создать объект класса ArrayList, нужно написать код типа:

ArrayList<Тип> имя = new ArrayList<Тип>();

Где ArrayList — это тип/класс коллекции, Тип — это тип элементов, которые хранит коллекция ArrayList, а имя — это имя переменной типа ArrayList<Тип>.

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

Примеры:

Код Описание
ArrayList<Integer> list = new ArrayList<Integer>();
Список целых чисел
ArrayList<String> list = new ArrayList<String>();
Список строк
ArrayList<Double> list = new ArrayList<Double>();
Список вещественных чисел

Коллекции, в отличие от массивов, не могут хранить примитивные типы: только типы-классы. Поэтому если вам нужна коллекция с типом int, используйте вместо него тип-обертку — Integer.


3. Операции с ArrayList

Изначально длина только что созданного списка равна нулю: он содержит 0 элементов. Если в список добавить один элемент, его длина увеличится на 1. Если удалить добавленный элемент, опять уменьшится до нуля.

Более подробно можно узнать о методах класса ArrayList из таблицы:

Методы Описание
void add(тип value)
Добавляет в список переданный элемент
void add(int index, тип value)
Добавляет элемент в определенное место списка.
тип get(int index)
Возвращает элемент, который находится под номером index
void set(int index, тип value)
Меняет значение элемента с номером index на value
тип remove(int index)
Удаляет элемент под номером index. Возвращает удаленный элемент.
boolean remove(тип value)
Удаляет элемент: нужно передать сам элемент в список. Если таких элементов несколько, будет удален первый из них.
void clear()
Очищает список — удаляет все элементы из списка.
boolean contains(тип value)
Проверяет, содержится ли в списке элемент value.
boolean isEmpty()
Проверяет, пустой список или нет. Равна ли длина списка нулю.
int size()
Возвращает размер списка — количество элементов списка.
тип[] toArray(тип[] array)
Возвращает массив, содержащий те же элементы, что и список.
Массив нужно передать в метод.

Данные методы позволяют делать со списком практически все возможные операции: менять элементы местами, добавлять элементы, удалять элементы. Можно даже очистить список одной командой или преобразовать список в массив.


undefined
15
Задача
Java Syntax Pro, 15 уровень, 2 лекция
Недоступна
Помощник преподавателя
Программа считывает с консоли номер, находит в журнале соответствующего студента и вызывает его отвечать. Но есть проблема: если в журнале нет студента с нужным номером, программа завершается с исключением ArrayIndexOutOfBoundsException. Оберни одну строку в try-catch, чтобы программа продолжала ра

4. Сравнение ArrayList и Array

Думаю, без сравнения ArrayList и массива нам не обойтись.

Фактически у массива есть всего 4 действия:

  • Создание массива
  • Получение элемента по номеру
  • Установка элемента по номеру
  • Получение длины массива

Вот аналоги этих операций в массиве и в ArrayList:

Массив ArrayList
String[] array = new String[10];
ArrayList<String> list = new  ArrayList<String>();
String s = array[0];
String s = list.get(0);
array[0] = "Пока";
list.set(0, "Пока");
int count = array.length;
int count = list.size();

Давайте сравним работу ArrayList с работой массива. Для примера решим такую задачу «ввести 10 строк с клавиатуры и вывести их на экран в обратном порядке»

Используем Array (массив) Используем ArrayList
Scanner console = new Scanner(System.in);

// ввод строк с клавиатуры
String[] list = new String[10];

for (int i = 0; i < list.length; i++)
{
    String s = console.nextLine();
    list[i] = s;
}

// вывод содержимого массива на экран
for (int i = 0; i < list.length; i++)
{
    int j = list.length - i - 1;
    System.out.println(list[j]);
}
Scanner console = new Scanner(System.in);

// ввод строк с клавиатуры
ArrayList<String> list = new ArrayList<String>();

for (int i = 0; i < 10; i++)
{
    String s = console.nextLine();
    list.add(s);
}

// вывод содержимого коллекции на экран
for (int i = 0; i < list.size(); i++)
{
    int j = list.size() - i - 1;
    System.out.println(list.get(j));
}

В принципе можно провести четкую аналогию. Причем в массиве все даже как-то короче и понятнее что-ли. Но и в ArrayList не сильно сложно: получить элемент — метод get(), изменить элемент — метод set(), получить длину списка — метод size().

Так зачем программисты используют класс ArrayList?

Конечно же, все дело в остальных методах, которых у массива нет и не будет:

  • Добавление элемента в список
  • Вставка элемента в середину списка
  • Поиск элемента в списке
  • Удаление элемента из списка

undefined
15
Задача
Java Syntax Pro, 15 уровень, 2 лекция
Недоступна
Помощник преподавателя-2
Программа считывает с консоли номер, находит в журнале соответствующего студента и вызывает его отвечать. И даже обрабатывает некорректные числа. Но есть еще одна проблема: если введено не целое число, метод parseInt бросает NumberFormatException. Оберни часть кода в try-catch так, чтобы программа
undefined
15
Задача
Java Syntax Pro, 15 уровень, 2 лекция
Недоступна
Помощник преподавателя-3
Программа считывает с консоли номер, находит в журнале соответствующего студента и вызывает его отвечать. Методы parseInt и get могут бросать исключения NumberFormatException и ArrayIndexOutOfBoundsException. Оберни их одним блоком try с двумя блоками catch. Блок catch для NumberFormatException дол