Наиболее часто используемая коллекция в Java – это список элементов с произвольным доступом. Такой список во многом напоминает массив, но с возможностью динамического добавления элементов.
Списки в Java представлены набором классов, реализующий интерфейс List
, в котором описаны общие методы для работы со списками, такими как проверка на существование, добавление, извлечение, замена и другими.
Сами классы, в первую очередь, отличаются друг от друга способом организации (структурой данных) внутри себя. Это происходит из-за того, что не существует универсально эффективного способа создать динамический список. Создатели языка Java решили предложить программистам набор разных реализаций, которые программисты должны выбирать в зависимости от того, какая реализация окажется наиболее эффективной для их ситуации. На практике такое происходит не часто и в большинстве случаев используется ArrayList
, который мы и рассмотрим в этом уроке.
import java.util.ArrayList;
var items = new ArrayList<String>();
items.add("Sun"); // Добавляется под индексом 0
items.add("Mars"); // Добавляется под индексом 1
System.out.println(items); // => [Sun, Mars]
// Проверка вхождения
items.contains("Sun"); // true
items.contains("sun"); // false
// Извлечение по индексу
items.get(0); // Sun
items.get(1); // Mars
items.size(); // 2
В этом примере мы создали пустую коллекцию, в которую добавили два элемента с помощью метода add()
, распечатали на экран и дальше провели набор типовых действий:
contains()
- проверяет наличие элемента в коллекции.get()
- возвращает элемент по его индексу. Индексация, как и в массивах, начинается с нуля. Обращение к несуществующему индексу приводит к исключению.size()
возвращает количество элементов.
Комбинируя эти методы, можно получить последний элемент в коллекции:
// Получение последнего элемента
items.get(items.size() - 1); // Mars
В коде используется новый для нас синтаксис с угловыми скобками ArrayList<String>
. Технически это называется дженериком, но проходить мы их будем позже, так как это довольно хитрая концепция. Сейчас же просто запомните, что коллекции – это контейнеры элементов одного типа, поэтому в коллекциях всегда нужно указывать то, что будет внутри них храниться. Вот несколько примеров:
var items = new ArrayList<Integer>();
items.add(100);
items.add(200);
System.out.println(items); // [100, 200]
// Предположим что у нас есть класс User
var users = new ArrayList<User>();
users.add(new User(/* параметры */));
Кроме добавления элементов, их можно изменять и удалять. Метод set()
заменяет элемент списка по указанному индексу на новый:
var items = new ArrayList<String>();
items.add("hexlet");
items.add("youtube");
items.set(1, "udemy");
System.out.println(items); // => [hexlet, udemy]
Метод remove()
удаляет элемент списка на основе его индекса:
var items = new ArrayList<String>();
items.add("hexlet");
items.add("youtube");
items.remove(0);
System.out.println(items); // => [youtube]
Если у списка есть начальный набор элементов и он достаточно большой, то их можно указать сразу с помощью метода List.of()
. Единственное нужно учитывать, что List.of()
создает неизменяемый список, то есть его элементы можно использовать, но изменять сам список нельзя. Чтобы добавить возможность его изменения, нужно выполнить его преобразование в ArrayList
.
import java.util.List;
import java.util.ArrayList;
// Неизменяемый список
var fixedItems = List.of("Sun", "Mars", /* еще множество элементов */);
var items = new ArrayList<>(fixedItems);
В таком случае Java выводит тип самостоятельно на основе типа первого параметра в List.of()
. То же самое происходит и в ArrayList
.
Apache Commons Collections
Стандартная библиотека предоставляет множество полезных методов для работы со списками, но даже их недостаточно для всех возникающих ситуаций. Поэтому полезно знать про библиотеку commons-collections4, в которой содержится огромное количество полезных методов на все случаи жизни. Мы будем использовать эту библиотеку как в этом, так и в последующих курсах.
import org.apache.commons.collections4.CollectionUtils;
var items = new ArrayList<String>();
// Добавляет элемент только если он не равен null
CollectionUtils.addIgnoreNull(items, /* значение */);
Дополнительные материалы
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.