Список і ArrayList у Java
Розпочнемо наше ознайомлення зі структурою даних List. Нижче наведено блок-схему, яка ілюструє ієрархію колекцій і списків. Вона може здатися великою та складною, але ми розглянемо її крок за кроком.
У цьому розділі ви дослідите конкретний тип колекції, який називається списками. Ви детальніше розглянете різні типи списків, зокрема ArrayList, LinkedList та Stack.
Оскільки всі списки наслідують інтерфейс List, ви можете створювати об'єкти, використовуючи батьківський інтерфейс. Але ми розглянемо це детальніше пізніше.
Зараз обговоримо перший тип списку – ArrayList.
Вище наведено синтаксис створення ArrayList<>. Є одна частина, з якою ви можете бути не знайомі – це узагальнення (generics). Ми розглянемо узагальнення та їх створення пізніше.
Поки що просто запам'ятайте, що при створенні ArrayList потрібно вказати тип даних у кутових дужках. Також майте на увазі, що списки не можуть працювати з примітивними типами даних. Замість цього використовуються клас-обгортки (wrapper classes).
Тепер створимо список у коді та додамо кілька об'єктів за допомогою методу add().
Main.java
1234567891011121314package 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
1234567891011121314151617181920212223242526272829303132333435package 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
12345678910111213141516171819202122232425262728293031323334package 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
123456789101112131415161718package 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
12345678910111213141516171819package 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
123456789101112131415161718package 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
123456789101112131415161718package 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
12345678910111213141516package 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. Як ми можемо створити список з масиву?
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат
Чудово!
Completion показник покращився до 4
Список і ArrayList у Java
Свайпніть щоб показати меню
Розпочнемо наше ознайомлення зі структурою даних List. Нижче наведено блок-схему, яка ілюструє ієрархію колекцій і списків. Вона може здатися великою та складною, але ми розглянемо її крок за кроком.
У цьому розділі ви дослідите конкретний тип колекції, який називається списками. Ви детальніше розглянете різні типи списків, зокрема ArrayList, LinkedList та Stack.
Оскільки всі списки наслідують інтерфейс List, ви можете створювати об'єкти, використовуючи батьківський інтерфейс. Але ми розглянемо це детальніше пізніше.
Зараз обговоримо перший тип списку – ArrayList.
Вище наведено синтаксис створення ArrayList<>. Є одна частина, з якою ви можете бути не знайомі – це узагальнення (generics). Ми розглянемо узагальнення та їх створення пізніше.
Поки що просто запам'ятайте, що при створенні ArrayList потрібно вказати тип даних у кутових дужках. Також майте на увазі, що списки не можуть працювати з примітивними типами даних. Замість цього використовуються клас-обгортки (wrapper classes).
Тепер створимо список у коді та додамо кілька об'єктів за допомогою методу add().
Main.java
1234567891011121314package 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
1234567891011121314151617181920212223242526272829303132333435package 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
12345678910111213141516171819202122232425262728293031323334package 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
123456789101112131415161718package 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
12345678910111213141516171819package 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
123456789101112131415161718package 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
123456789101112131415161718package 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
12345678910111213141516package 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. Як ми можемо створити список з масиву?
Дякуємо за ваш відгук!