Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Вивчайте Список і ArrayList у Java | Основні Структури Даних у Java
Структури Даних Java

bookСписок і ArrayList у Java

Розпочнемо наше ознайомлення зі структурою даних List. Нижче наведено блок-схему, яка ілюструє ієрархію колекцій і списків. Вона може здатися великою та складною, але ми розглянемо її крок за кроком.

У цьому розділі ви дослідите конкретний тип колекції, який називається списками. Ви детальніше розглянете різні типи списків, зокрема ArrayList, LinkedList та Stack.

Оскільки всі списки наслідують інтерфейс List, ви можете створювати об'єкти, використовуючи батьківський інтерфейс. Але ми розглянемо це детальніше пізніше.

Зараз обговоримо перший тип списку – ArrayList.

Вище наведено синтаксис створення ArrayList<>. Є одна частина, з якою ви можете бути не знайомі – це узагальнення (generics). Ми розглянемо узагальнення та їх створення пізніше.

Поки що просто запам'ятайте, що при створенні ArrayList потрібно вказати тип даних у кутових дужках. Також майте на увазі, що списки не можуть працювати з примітивними типами даних. Замість цього використовуються клас-обгортки (wrapper classes).

Тепер створимо список у коді та додамо кілька об'єктів за допомогою методу add().

Main.java

Main.java

copy
1234567891011121314
package com.example; import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { List<Integer> numberList = new ArrayList<>(); numberList.add(10); numberList.add(15); numberList.add(5); System.out.println(numberList); } }

Як видно, метод add() є дуже простим — він просто додає вказане значення до списку.

Також слід пам'ятати, що необхідно імпортувати List та ArrayList з бібліотеки java.util. Однак, якщо ви використовуєте IntelliJ IDEA, ці бібліотеки імпортуються автоматично, тому турбуватися про це не потрібно.

Тепер розглянемо приклад створення списку з нашим власним типом даних:

Main.java

Main.java

copy
1234567891011121314151617181920212223242526272829303132333435
package com.example; import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { Dog bob = new Dog("Bob", 2); Dog ben = new Dog("Ben", 1); Dog brian = new Dog("Brian", 5); List<Dog> dogList = new ArrayList<>(); dogList.add(bob); dogList.add(ben); dogList.add(brian); System.out.println(dogList); } } class Dog { String name; int age; public Dog(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "Dog{" + "name='" + name + '\'' + ", age=" + age + '}'; } }

Як бачите, ми створили власний клас Dog і ArrayList, використовуючи цей тип даних. Під час виведення списку було показано всі об'єкти, що зберігаються в ньому.

Що робити, якщо у вас є масив і потрібно перетворити його на список? Це можна зробити за допомогою методу asList() з класу Arrays.

Цей метод дозволяє створити список, який містить ті самі елементи, що й початковий масив. Особливо корисно, коли потрібно застосувати методи списку до масиву. Синтаксис простий:

Arrays.asList(arrayName);

І його можна одразу використати під час ініціалізації нового списку, наприклад:

Main.java

Main.java

copy
12345678910111213141516171819202122232425262728293031323334
package com.example; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class Main { public static void main(String[] args) { Dog bob = new Dog("Bob", 2); Dog ben = new Dog("Ben", 1); Dog brian = new Dog("Brian", 5); Dog[] dogs = {bob, ben, brian}; List<Dog> dogList = new ArrayList<>(Arrays.asList(dogs)); System.out.println(dogList); } } class Dog { String name; int age; public Dog(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "Dog{" + "name='" + name + '\'' + ", age=" + age + '}'; } }

Так само, як можна перетворити масив на список, можна також перетворити список на масив за допомогою методу toArray().

Методи ArrayList<>

Розглянемо основні методи списку. До цього моменту ви могли б легко замінити списки масивами, але ось у чому головна відмінність — методи.

Метод add() є перевантаженим методом, тобто має кілька варіацій. Одна з них дозволяє додати елемент у певний індекс.

Коли ви вставляєте елемент у середину списку, усі елементи праворуч зміщуються на одну позицію, щоб звільнити місце для нового елемента.

Наприклад, якщо ви додаєте елемент на початок списку, усі наявні елементи змістяться на одну позицію праворуч.

Розглянемо приклад:

Main.java

Main.java

copy
123456789101112131415161718
package com.example; import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { List<Integer> numbers = new ArrayList<>(); for (int i = 0; i < 5; i++) { // Filling `numbers` list with 5 values numbers.add(i); } System.out.println("`numbers` before modifying: " + numbers); numbers.add(2, 10); // Adding 10 on the second index System.out.println("`numbers` after first modifying: " + numbers); numbers.add(0, 5); System.out.println("`numbers` after second modifying: " + numbers); } }

Те, як значення зміщуються під час вставки елемента, можна візуалізувати на наступній ілюстрації:

Отримання елементів

Очевидно, якщо можна додавати об'єкти до списку за певним індексом, також можна отримувати об'єкти за їхнім індексом за допомогою методу get(int index).

Розглянемо приклад:

Main.java

Main.java

copy
12345678910111213141516171819
package com.example; import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { List<String> names = new ArrayList<>(); names.add("Alice"); names.add("Bob"); names.add("Charlie"); names.add("David"); names.add("Eva"); // Retrieving element by index String element = names.get(2); // Retrieving the 3rd element (index starts from 0) System.out.println("The element at index 2 is: " + element); } }

Видалення елементів

Можна додавати, можна отримувати, але чи можна видаляти? Звісно! Для видалення елементів використовується метод remove(int index).

Цей метод також перевантажений, тобто існує ще один спосіб видалити елемент. Можна скористатися методом remove(Object obj), який видаляє перше входження вказаного елемента.

Уявімо, що у вас є великий список усіх студентів нашого курсу. Однак один студент поводився неналежно і був відрахований. Ви не знаєте його точного індексу, тому потрібно видалити його за ім'ям. Але є нюанс — код трохи зламаний, і його ім'я може зустрічатися кілька разів у списку.

Напишемо програму для видалення усіх входжень цього студента зі списку:

Main.java

Main.java

copy
123456789101112131415161718
package com.example; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class Main { public static void main(String[] args) { String[] names = {"Bob", "Alice", "Charlie", "David", "Eva", "Frank", "Grace", "Hank", "Ivy", "Jack", "Katherine", "Leo", "Mia", "Nathan", "Olivia", "Paul", "Quinn", "Rachel", "Sam", "Tom", "Ursula", "Victor", "Wendy", "Xander", "Yvonne", "Zack", "Bob", "Emily", "Bob", "Jake", "Isabel", "Liam", "Nora", "Bob", "Sophia", "Bob", "Daniel", "Gabrielle", "Mike"}; // Expelled student: Bob List<String> students = new ArrayList<>(Arrays.asList(names)); System.out.println("Is Bob present in the list? " + students.contains("Bob")); while (students.contains("Bob")) { students.remove("Bob"); } System.out.println("Is Bob still present in the list after the removal operation? " + students.contains("Bob")); } }

Ви могли помітити, що ми використали ще один метод спискуcontains(Object obj). Цей метод перевіряє, чи присутній вказаний елемент у списку, і повертає true або false.

Використовуючи contains(), ми встановлюємо умову для циклу while, що дозволяє видалити всі входження студента на кшталт "Bob" зі списку.

До речі, цей процес можна значно спростити за допомогою методу removeAll(Collection<?> c):

Main.java

Main.java

copy
123456789101112131415161718
package com.example; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class Main { public static void main(String[] args) { String[] names = {"Bob", "Alice", "Charlie", "David", "Eva", "Frank", "Grace", "Hank", "Ivy", "Jack", "Katherine", "Leo", "Mia", "Nathan", "Olivia", "Paul", "Quinn", "Rachel", "Sam", "Tom", "Ursula", "Victor", "Wendy", "Xander", "Yvonne", "Zack", "Bob", "Emily", "Bob", "Jake", "Isabel", "Liam", "Nora", "Bob", "Sophia", "Bob", "Daniel", "Gabrielle", "Mike"}; // Expelled student: Bob List<String> students = new ArrayList<>(Arrays.asList(names)); System.out.println("Is Bob present in the list? " + students.contains("Bob")); List<String> expelledStudents = new ArrayList<>(); expelledStudents.add("Bob"); students.removeAll(expelledStudents); System.out.println("Is Bob still present in the list after the removal operation? " + students.contains("Bob")); } }

Метод removeAll() приймає колекцію як параметр, що містить значення, які будуть видалені зі списку, до якого застосовано цей метод.

У цьому підході ми створили колекцію відрахованих студентів і додали до неї "Bob". Це робить наш код легко розширюваним — ви можете просто додавати нових порушників до списку відрахованих студентів з часом.

Оновлення значення за індексом

Повернемося до методів списку — тепер розглянемо метод оновлення.

Оскільки метод add() просто зсуває всі елементи вправо при вставці нового значення, нам потрібен інший спосіб оновити існуюче значення за індексом.

Метод set(int index, Object value) виконує саме цю задачу:

Main.java

Main.java

copy
12345678910111213141516
package com.example; import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { List<Integer> example = new ArrayList<>(); for (int i = 1; i <= 5; i++) { example.add(i); } System.out.println("List before modification: " + example); example.set(2, 28); System.out.println("List after modification: " + example); } }

Це досить просто — ми замінили елемент на другому індексі на число 28.

Інші методи

Ви вже розглянули найпоширеніші методи, але існує ще багато інших. Оскільки вони використовуються рідко, ми не будемо зупинятися на кожному з них.

Натомість ви можете знайти всі необхідні методи — разом із повною документацією та детальними поясненнями — відкривши клас ArrayList у IntelliJ IDEA.

Щоб це зробити, просто імпортуйте бібліотеку ArrayList, утримуйте клавішу Command key (Ctrl для Windows) і натисніть на ArrayList. Ви побачите всі поля та методи, доступні в цьому класі, що допоможе вам дослідити будь-які пропущені методи.

1. Який метод можна використати для додавання елемента за індексом?

2. Який метод можна використати для отримання елемента за індексом?

3. Який метод можна використати для видалення першого входження елемента?

4. Який метод можна використати для заміни елемента за індексом?

5. Який метод можна використати для перевірки наявності елемента?

6. Чи можемо ми створити список з масиву?

7. Як ми можемо створити список з масиву?

question mark

Який метод можна використати для додавання елемента за індексом?

Select the correct answer

question mark

Який метод можна використати для отримання елемента за індексом?

Select the correct answer

question mark

Який метод можна використати для видалення першого входження елемента?

Select the correct answer

question mark

Який метод можна використати для заміни елемента за індексом?

Select the correct answer

question mark

Який метод можна використати для перевірки наявності елемента?

Select the correct answer

question mark

Чи можемо ми створити список з масиву?

Select the correct answer

question mark

Як ми можемо створити список з масиву?

Select the correct answer

Все було зрозуміло?

Як ми можемо покращити це?

Дякуємо за ваш відгук!

Секція 1. Розділ 2

Запитати АІ

expand

Запитати АІ

ChatGPT

Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат

bookСписок і ArrayList у Java

Свайпніть щоб показати меню

Розпочнемо наше ознайомлення зі структурою даних List. Нижче наведено блок-схему, яка ілюструє ієрархію колекцій і списків. Вона може здатися великою та складною, але ми розглянемо її крок за кроком.

У цьому розділі ви дослідите конкретний тип колекції, який називається списками. Ви детальніше розглянете різні типи списків, зокрема ArrayList, LinkedList та Stack.

Оскільки всі списки наслідують інтерфейс List, ви можете створювати об'єкти, використовуючи батьківський інтерфейс. Але ми розглянемо це детальніше пізніше.

Зараз обговоримо перший тип списку – ArrayList.

Вище наведено синтаксис створення ArrayList<>. Є одна частина, з якою ви можете бути не знайомі – це узагальнення (generics). Ми розглянемо узагальнення та їх створення пізніше.

Поки що просто запам'ятайте, що при створенні ArrayList потрібно вказати тип даних у кутових дужках. Також майте на увазі, що списки не можуть працювати з примітивними типами даних. Замість цього використовуються клас-обгортки (wrapper classes).

Тепер створимо список у коді та додамо кілька об'єктів за допомогою методу add().

Main.java

Main.java

copy
1234567891011121314
package com.example; import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { List<Integer> numberList = new ArrayList<>(); numberList.add(10); numberList.add(15); numberList.add(5); System.out.println(numberList); } }

Як видно, метод add() є дуже простим — він просто додає вказане значення до списку.

Також слід пам'ятати, що необхідно імпортувати List та ArrayList з бібліотеки java.util. Однак, якщо ви використовуєте IntelliJ IDEA, ці бібліотеки імпортуються автоматично, тому турбуватися про це не потрібно.

Тепер розглянемо приклад створення списку з нашим власним типом даних:

Main.java

Main.java

copy
1234567891011121314151617181920212223242526272829303132333435
package com.example; import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { Dog bob = new Dog("Bob", 2); Dog ben = new Dog("Ben", 1); Dog brian = new Dog("Brian", 5); List<Dog> dogList = new ArrayList<>(); dogList.add(bob); dogList.add(ben); dogList.add(brian); System.out.println(dogList); } } class Dog { String name; int age; public Dog(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "Dog{" + "name='" + name + '\'' + ", age=" + age + '}'; } }

Як бачите, ми створили власний клас Dog і ArrayList, використовуючи цей тип даних. Під час виведення списку було показано всі об'єкти, що зберігаються в ньому.

Що робити, якщо у вас є масив і потрібно перетворити його на список? Це можна зробити за допомогою методу asList() з класу Arrays.

Цей метод дозволяє створити список, який містить ті самі елементи, що й початковий масив. Особливо корисно, коли потрібно застосувати методи списку до масиву. Синтаксис простий:

Arrays.asList(arrayName);

І його можна одразу використати під час ініціалізації нового списку, наприклад:

Main.java

Main.java

copy
12345678910111213141516171819202122232425262728293031323334
package com.example; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class Main { public static void main(String[] args) { Dog bob = new Dog("Bob", 2); Dog ben = new Dog("Ben", 1); Dog brian = new Dog("Brian", 5); Dog[] dogs = {bob, ben, brian}; List<Dog> dogList = new ArrayList<>(Arrays.asList(dogs)); System.out.println(dogList); } } class Dog { String name; int age; public Dog(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "Dog{" + "name='" + name + '\'' + ", age=" + age + '}'; } }

Так само, як можна перетворити масив на список, можна також перетворити список на масив за допомогою методу toArray().

Методи ArrayList<>

Розглянемо основні методи списку. До цього моменту ви могли б легко замінити списки масивами, але ось у чому головна відмінність — методи.

Метод add() є перевантаженим методом, тобто має кілька варіацій. Одна з них дозволяє додати елемент у певний індекс.

Коли ви вставляєте елемент у середину списку, усі елементи праворуч зміщуються на одну позицію, щоб звільнити місце для нового елемента.

Наприклад, якщо ви додаєте елемент на початок списку, усі наявні елементи змістяться на одну позицію праворуч.

Розглянемо приклад:

Main.java

Main.java

copy
123456789101112131415161718
package com.example; import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { List<Integer> numbers = new ArrayList<>(); for (int i = 0; i < 5; i++) { // Filling `numbers` list with 5 values numbers.add(i); } System.out.println("`numbers` before modifying: " + numbers); numbers.add(2, 10); // Adding 10 on the second index System.out.println("`numbers` after first modifying: " + numbers); numbers.add(0, 5); System.out.println("`numbers` after second modifying: " + numbers); } }

Те, як значення зміщуються під час вставки елемента, можна візуалізувати на наступній ілюстрації:

Отримання елементів

Очевидно, якщо можна додавати об'єкти до списку за певним індексом, також можна отримувати об'єкти за їхнім індексом за допомогою методу get(int index).

Розглянемо приклад:

Main.java

Main.java

copy
12345678910111213141516171819
package com.example; import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { List<String> names = new ArrayList<>(); names.add("Alice"); names.add("Bob"); names.add("Charlie"); names.add("David"); names.add("Eva"); // Retrieving element by index String element = names.get(2); // Retrieving the 3rd element (index starts from 0) System.out.println("The element at index 2 is: " + element); } }

Видалення елементів

Можна додавати, можна отримувати, але чи можна видаляти? Звісно! Для видалення елементів використовується метод remove(int index).

Цей метод також перевантажений, тобто існує ще один спосіб видалити елемент. Можна скористатися методом remove(Object obj), який видаляє перше входження вказаного елемента.

Уявімо, що у вас є великий список усіх студентів нашого курсу. Однак один студент поводився неналежно і був відрахований. Ви не знаєте його точного індексу, тому потрібно видалити його за ім'ям. Але є нюанс — код трохи зламаний, і його ім'я може зустрічатися кілька разів у списку.

Напишемо програму для видалення усіх входжень цього студента зі списку:

Main.java

Main.java

copy
123456789101112131415161718
package com.example; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class Main { public static void main(String[] args) { String[] names = {"Bob", "Alice", "Charlie", "David", "Eva", "Frank", "Grace", "Hank", "Ivy", "Jack", "Katherine", "Leo", "Mia", "Nathan", "Olivia", "Paul", "Quinn", "Rachel", "Sam", "Tom", "Ursula", "Victor", "Wendy", "Xander", "Yvonne", "Zack", "Bob", "Emily", "Bob", "Jake", "Isabel", "Liam", "Nora", "Bob", "Sophia", "Bob", "Daniel", "Gabrielle", "Mike"}; // Expelled student: Bob List<String> students = new ArrayList<>(Arrays.asList(names)); System.out.println("Is Bob present in the list? " + students.contains("Bob")); while (students.contains("Bob")) { students.remove("Bob"); } System.out.println("Is Bob still present in the list after the removal operation? " + students.contains("Bob")); } }

Ви могли помітити, що ми використали ще один метод спискуcontains(Object obj). Цей метод перевіряє, чи присутній вказаний елемент у списку, і повертає true або false.

Використовуючи contains(), ми встановлюємо умову для циклу while, що дозволяє видалити всі входження студента на кшталт "Bob" зі списку.

До речі, цей процес можна значно спростити за допомогою методу removeAll(Collection<?> c):

Main.java

Main.java

copy
123456789101112131415161718
package com.example; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class Main { public static void main(String[] args) { String[] names = {"Bob", "Alice", "Charlie", "David", "Eva", "Frank", "Grace", "Hank", "Ivy", "Jack", "Katherine", "Leo", "Mia", "Nathan", "Olivia", "Paul", "Quinn", "Rachel", "Sam", "Tom", "Ursula", "Victor", "Wendy", "Xander", "Yvonne", "Zack", "Bob", "Emily", "Bob", "Jake", "Isabel", "Liam", "Nora", "Bob", "Sophia", "Bob", "Daniel", "Gabrielle", "Mike"}; // Expelled student: Bob List<String> students = new ArrayList<>(Arrays.asList(names)); System.out.println("Is Bob present in the list? " + students.contains("Bob")); List<String> expelledStudents = new ArrayList<>(); expelledStudents.add("Bob"); students.removeAll(expelledStudents); System.out.println("Is Bob still present in the list after the removal operation? " + students.contains("Bob")); } }

Метод removeAll() приймає колекцію як параметр, що містить значення, які будуть видалені зі списку, до якого застосовано цей метод.

У цьому підході ми створили колекцію відрахованих студентів і додали до неї "Bob". Це робить наш код легко розширюваним — ви можете просто додавати нових порушників до списку відрахованих студентів з часом.

Оновлення значення за індексом

Повернемося до методів списку — тепер розглянемо метод оновлення.

Оскільки метод add() просто зсуває всі елементи вправо при вставці нового значення, нам потрібен інший спосіб оновити існуюче значення за індексом.

Метод set(int index, Object value) виконує саме цю задачу:

Main.java

Main.java

copy
12345678910111213141516
package com.example; import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { List<Integer> example = new ArrayList<>(); for (int i = 1; i <= 5; i++) { example.add(i); } System.out.println("List before modification: " + example); example.set(2, 28); System.out.println("List after modification: " + example); } }

Це досить просто — ми замінили елемент на другому індексі на число 28.

Інші методи

Ви вже розглянули найпоширеніші методи, але існує ще багато інших. Оскільки вони використовуються рідко, ми не будемо зупинятися на кожному з них.

Натомість ви можете знайти всі необхідні методи — разом із повною документацією та детальними поясненнями — відкривши клас ArrayList у IntelliJ IDEA.

Щоб це зробити, просто імпортуйте бібліотеку ArrayList, утримуйте клавішу Command key (Ctrl для Windows) і натисніть на ArrayList. Ви побачите всі поля та методи, доступні в цьому класі, що допоможе вам дослідити будь-які пропущені методи.

1. Який метод можна використати для додавання елемента за індексом?

2. Який метод можна використати для отримання елемента за індексом?

3. Який метод можна використати для видалення першого входження елемента?

4. Який метод можна використати для заміни елемента за індексом?

5. Який метод можна використати для перевірки наявності елемента?

6. Чи можемо ми створити список з масиву?

7. Як ми можемо створити список з масиву?

question mark

Який метод можна використати для додавання елемента за індексом?

Select the correct answer

question mark

Який метод можна використати для отримання елемента за індексом?

Select the correct answer

question mark

Який метод можна використати для видалення першого входження елемента?

Select the correct answer

question mark

Який метод можна використати для заміни елемента за індексом?

Select the correct answer

question mark

Який метод можна використати для перевірки наявності елемента?

Select the correct answer

question mark

Чи можемо ми створити список з масиву?

Select the correct answer

question mark

Як ми можемо створити список з масиву?

Select the correct answer

Все було зрозуміло?

Як ми можемо покращити це?

Дякуємо за ваш відгук!

Секція 1. Розділ 2
some-alt