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)
Повертає масив, який містить ті самі елементи, що й список.
Масив потрібно передати в метод

Ці методи дають змогу виконувати зі списком практично всі можливі операції: міняти елементи місцями, додавати елементи, видаляти елементи. Можна навіть очистити список за допомогою однієї команди або перетворити список на масив.



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?

Звичайно ж, основна причина в інших методах, яких у масиву немає й не буде:

  • Додавання елемента до списку
  • Додавання елемента в середину списку
  • Пошук елемента в списку
  • Видалення елемента зі списку