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

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


16
Задача
Java Syntax Zero,  16 рівень2 лекція
Недоступна
Переплутані байти
Напиши програму, яка зчитує з консолі шлях до файлу1 і шлях до файлу2. Далі все байти з файлу1 записує у файл2, але водночас міняє їх місцями за таким принципом: перший із другим, третій із четвертим і т. д. Якщо останній байт у файлі1 непарний, то пишемо його у файл2 як є. Для читання й з

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?

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

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

16
Задача
Java Syntax Zero,  16 рівень2 лекція
Недоступна
Чомусь не копіюється…
Є програма, яка зчитує з консолі шлях до файлу1 і шлях до файлу2 та копіює вміст файлу1 у файл2. Але вона працює некоректно. Знайди й виправ помилку в коді, щоб програма працювала як належить.
16
Задача
Java Syntax Zero,  16 рівень2 лекція
Недоступна
Фейсконтроль
Напиши програму, яка зчитує з консолі ім'я текстового файлу, далі читає символи з цього файлу (використай метод readAllLines(Path) класу Files) і виводить на екран усе, крім крапок, ком і пробілів.