JavaRush /Курси /Java Syntax Zero /Колекції в Java: ArrayList

Колекції в Java: ArrayList

Java Syntax Zero
Рівень 13 , Лекція 3
Відкрита

1. Клас ArrayList

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

Щоб повністю зрозуміти, як влаштовані колекції і всі нюанси їх роботи, потрібно спочатку вивчити ООП, інтерфейси, наслідування, основи багатопоточності та багато іншого.

Тож сьогодні ми просто познайомимося з найпростішою колекцією. Але на досить глибокому рівні, щоб ти розумів, як нею користуватися і як вона працює. Отже, знайомся: колекція 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?

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

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

Коментарі (12)
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ
Зоряна Блащук Рівень 23
16 вересня 2024
ArrayList<Integer> numbers = new ArrayList<>(Arrays.asList(56, 45, 89, 1, 45, 13, 4, 69, 11, -89)); - в цьому випадку ми не вказуєм тип в правій частині. а в першому прикладі вказуємо ArrayList<Integer> list = new ArrayList<Integer>();. а такий варіант допустимий: ArrayList<Integer> list = new ArrayList<>()?
Михайло Рівень 117
5 січня 2025
так допустимий, бо компілятор сам розуміє, що за тип там має бути
Christopher Ward 595 Рівень 16
5 серпня 2024
Тепер треба запам'ятати різницю в ініціцалізації: Arrays : int[] numbers = {56, 45, 89, 1, 45, 13, 4, 69, 11, -89}; ArrayList : ArrayList<Integer> numbers = new ArrayList<>(Arrays.asList(56, 45, 89, 1, 45, 13, 4, 69, 11, -89)); Дякую, тепер стало простіше 😅
Андрій Рівень 18
16 січня 2024
Тяжко😬
Гаркін Рівень 14
18 травня 2024
А як на мене, так колекції це ок. Тіж масиви і усе. Ось static та пов'язане з ним у методах мені мозок виносить - сподіваюсь з досвідом хоч звикну до тих особливостей.
Василь Рівень 4
10 вересня 2023
Колекції це хащі, але якщо їх опанувати то з ними приємно працювати і за допомогою їх можна вирішити багато задач.
Андрии Бумер Рівень 37
3 квітня 2024
мені здалось що їх простіше гуглити, або я вже навчився правильно запити писати))
Roma Chernesh Рівень 16
22 січня 2023
Поки що йде зі скрипом.
Андрии Бумер Рівень 37
3 квітня 2024
напевно вже пройшло) чим змащував?
Саша Рівень 30
25 жовтня 2022
Що робить ":"? Десь пропустив, а тепер знайти не можу
kalkulator¹ Рівень 51
10 листопада 2022
це Ternary Operator і це те саме, що і else
Neridnyi Taras Рівень 23
14 жовтня 2022
Цікаво....