Java надає безліч структур даних для зручної роботи з колекціями об’єктів. Однією з найпоширеніших є ArrayList. У цій статті ми розглянемо основи ArrayList Java, його створення, методи роботи, а також застосування в асоціативних масивах.
ArrayList в Java являє собою динамічний масив, який розширюється в міру необхідності. Він є частиною бібліотеки колекцій Java і використовується для зберігання та керування списком об’єктів. На відміну від звичайного масиву, його розмір автоматично збільшується при додаванні нових елементів, що робить його більш зручним для роботи з динамічними даними.
ArrayList є однією з найбільш часто використовуваних структур даних у Java завдяки своїй гнучкості, зручності та ефективності під час роботи з динамічними даними.
Створення та ініціалізація
ArrayList в Java створюється з використанням різних конструкторів і методів ініціалізації.
📆 Тривалість курсу: Середній час проходження – 2-4 тижні.
💵 Вартість: 2 450 грн | 80 USD
- Використання конструкторів
- Порожній конструктор створює порожній список: ArrayList<String> list1 = new ArrayList<>();
- конструктор з початковою ємністю створює список із зазначеною ємністю: ArrayList<Integer> list2 = new ArrayList<>(10);
- Методи ініціалізації
- Додавання елементів за допомогою методу add(): list3.add(“Java”);
- використання Arrays.asList() для ініціалізації з масиву: ArrayList<Integer> list4 = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
- ініціалізація з іншої колекції: ArrayList<Character> list5 = new ArrayList<>(Arrays.asList(‘a’, ‘b’, ‘c’));
Наведемо ще приклади:
- Ініціалізація за допомогою методу add()
ArrayList<String> list3 = new ArrayList<>();
list3.add("Java");
list3.add("Python");
list3.add("JavaScript");
- Ініціалізація з використанням Arrays.asList()
ArrayList<Integer> list4 = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
- Ініціалізація з використанням колекції
ArrayList<Character> list5 = new ArrayList<>(Arrays.asList('a', 'b', 'c'));
Основні методи роботи
ArrayList в Java надає безліч методів для роботи з елементами списку, включно з додаванням, видаленням, зміною та доступом до елементів:
- Додавання елементів
- add(E element): додає елемент у кінець списку.
ArrayList<String> list = new ArrayList<>();
list.add("Java");
list.add("Python");
- add(int index, E element): додає елемент у вказану позицію в списку.
list.add(1, "JavaScript");
2. Видалення елементів
- remove(Object o): видаляє перше входження зазначеного елемента зі списку.
list.remove("Python");
- remove(int index): видаляє елемент за вказаним індексом.
list.remove(0);
3. Доступ до елементів
get(int index): повертає елемент за вказаним індексом.
String element = list.get(0);
4. Зміна елементів
- set(int index, E element): замінює елемент за вказаним індексом новим елементом.
list.set(0, "C++");
5. Розмір списку
- size(): повертає кількість елементів у списку.
int size = list.size();
6. Перевірка наявності елементів
isEmpty(): повертає true, якщо список порожній, і false в іншому випадку.
boolean isEmpty = list.isEmpty();
Таким чином, методи роботи з ArrayList дають змогу зручно керувати елементами списку, роблячи його потужним інструментом для роботи з колекціями даних у Java (познайомитися з даною темою і практично створити колекцію і цикл обходу по масиву і колекції, студенти компанії FoxmindED можуть на онлайн-курсі Java Start).
Сортування
Сортування елементів в ArrayList є однією з основних операцій під час роботи з колекціями даних. У Java для цього можна використовувати різні способи, включно з методами Collections.sort() і ArrayList.sort():
- Метод Collections.sort() дає змогу сортувати елементи списку з використанням порівняння за замовчуванням (за зростанням для чисел і лексикографічно для рядків) або за допомогою зазначеного компаратора.
ArrayList<Integer> numbers = new ArrayList<>(Arrays.asList(3, 1, 2));
Collections.sort(numbers); // Sort Ascending
- Метод ArrayList.sort() у Java 8 і пізніших версіях також дає змогу сортувати елементи списку з використанням порівняння за замовчуванням або за допомогою компаратора.
ArrayList<String> names = new ArrayList<>(Arrays.asList("Alice", "Bob", "Charlie"));
names.sort(Comparator.reverseOrder()); // Sort in reverse order
- Компаратори ж дають змогу визначити власні правила порівняння об’єктів і використовувати їх для сортування.
ArrayList<Person> people = new ArrayList<>();
people.add(new Person("Alice", 25));
people.add(new Person("Bob", 30));
people.add(new Person("Charlie", 20));
people.sort(Comparator.comparing(Person::getName)); // Sort by name
- Інтерфейс Comparable дає змогу класу реалізувати природний порядок сортування. Об’єкти, що реалізують Comparable, можуть бути відсортовані з використанням методів sort().
public class Student implements Comparable<Student> {
private String name;
private int age;
Таким чином, ми маємо гнучкі можливості для впорядкування елементів списку відповідно до заданих правил порівняння.
Асоціативні масиви
ArrayList у Java може бути використаний для реалізації структури даних, аналогічної асоціативному масиву. У цій структурі кожному ключу відповідає певне значення, що дає змогу ефективно зберігати та отримувати доступ до даних.
Приклад створення та роботи з асоціативними масивами в Java може мати такий вигляд:
import java.util.ArrayList;
public class AssociativeArrayExample {
public static void main(String[] args) {
- Створення асоціативного масиву з використанням ArrayList
ArrayList<String> keys = new ArrayList<>();
ArrayList<Integer> values = new ArrayList<>();
- Додавання елементів в асоціативний масив
keys.add("apple");
values.add(10);
keys.add("banana");
values.add(20);
keys.add("orange");
values.add(15);
- Отримання значення за ключем
int appleCount = values.get(keys.indexOf("apple"));
System.out.println("Number of apples: " + appleCount);
- Зміна значення за ключем
values.set(keys.indexOf("banana"), 25);
System.out.println("Number of bananas: " + values.get(keys.indexOf("banana")));
- Видалення елемента за ключем
int index = keys.indexOf("orange");
keys.remove(index);
values.remove(index);
}
}
Робота з багатовимірними ArrayList
Багатовимірні ArrayList являють собою списки, що містять інші списки як свої елементи. Вони використовуються для зберігання складних структур даних, таких як матриці, таблиці або списки списків.
- Багатовимірні ArrayList можна створити шляхом вкладання списків усередині інших списків:
ArrayList<ArrayList<Integer>> matrix = new ArrayList<>();
- Ініціалізація багатовимірних ArrayList може бути виконана шляхом додавання списків в основний список. Наприклад, для створення матриці 3×3:
ArrayList<ArrayList<Integer>> matrix = new ArrayList<>();
for (int i = 0; i < 3; i++) {
ArrayList<Integer> row = new ArrayList<>();
for (int j = 0; j < 3; j++) {
row.add(0); // Initializing each element to zero
}
matrix.add(row); // Adding a Row to a Matrix
}
- Що стосується доступу до елементів багатовимірного ArrayList, то він відбувається за допомогою індексів та методу get():
int element = matrix.get(i).get(j);
Загалом їх можна використовувати для вирішення широкого спектра завдань, пов’язаних з обробленням і зберіганням даних.
Оптимізація роботи
ArrayList у Java забезпечує гнучке зберігання даних, але неправильне використання може призвести до зайвих витрат ресурсів і зниження продуктивності. Для оптимізації роботи важливо враховувати кілька аспектів.
По-перше, рекомендується вказувати початкову ємність, особливо якщо відома приблизна кількість елементів. Це допомагає уникнути зайвих перевиділень пам’яті та копіювання елементів під час збільшення розміру списку.
По-друге, управління пам’яттю відіграє важливу роль під час роботи з великими обсягами даних. Непотрібні об’єкти слід видаляти зі списку, використовуючи методи clear() або remove(), щоб уникнути витоків пам’яті.
Крім того, розмір може впливати на продуктивність операцій додавання, видалення та доступу до елементів. Великий розмір списку може збільшити час виконання операцій, особливо під час перевиділення пам’яті та копіювання елементів.
Тому важливо обирати оптимальний розмір списку залежно від конкретного завдання і типу операцій, які будуть виконуватися.
Приклади використання в реальних проектах
Давайте розглянемо кілька практичних прикладів використання динамічного масиву та проаналізуємо його переваги й недоліки порівняно з іншими колекціями.
Приклади використання:
1. Керування списком студентів у навчальному додатку
ArrayList<Student> studentsList = new ArrayList<>();
// Додавання студентів до списку
studentsList.add(new Student("Alice", 20));
studentsList.add(new Student("Bob", 22));
studentsList.add(new Student("Charlie", 21));
// Search for a student by name
Student foundStudent = null;
for (Student student : studentsList) {
if (student.getName().equals("Bob")) {
foundStudent = student;
break;
}
}
// Removing a student from the list
studentsList.remove(foundStudent);
2. Зберігання даних замовлень в інтернет-магазині:
ArrayList<Order> ordersList = new ArrayList<>();
// Adding new orders to the list
ordersList.add(new Order("1234", 50.99));
ordersList.add(new Order("5678", 30.49));
ordersList.add(new Order("91011", 75.25));
// Calculating the total amount of orders
double totalAmount = 0;
for (Order order : ordersList) {
totalAmount += order.getAmount();
}
Розглянемо переваги та недоліки ArrayList:
Коллекція | Переваги | Недоліки |
ArrayList | Простота використання; Гнучкість при додаванні, видаленні та доступі до елементів; Підтримка узагальнень. | Відносно повільні операції вставки та видалення елементів у середині списку через зсув елементів. Перевиділення пам’яті при збільшенні розміру списку. Повільні операції додавання і видалення елементів при великих обсягах даних. |
LinkedList | Швидке додавання і видалення елементів на початку і середині списку; Меньше перевиділення пам’яті. | Повільний доступ до елементів за індексом; Велике споживання пам’яті через додаткові посилання на наступний і попередній елементи. |
HashMap | Швидкий пошук за ключем; Гнучкість при зберіганні пар “ключ-значення”; Відсутність дублікатів ключів. | Відносно повільні операції ітерації по всій колекції; Немає гарантії порядку елементів. |
TreeSet | Автоматичне сортування елементів; Швидкий доступ до мінімального і максимального елементів. | Повільні операції додавання і видалення елементів із середини списку через пересортування. Обмеження на зберігання дублікатів. |
Як бачимо, ArrayList надає простий і зручний інтерфейс, але може бути неефективним при великих об’ємах даних або частих операціях вставки і видалення.
Висновок
ArrayList відіграє важливу роль у програмуванні на Java, надаючи зручний і ефективний спосіб роботи з колекціями об’єктів. Розуміння його основ і методів роботи допоможе у створенні більш ефективного і чистого коду. Рекомендуємо вивчати і практикуватися в роботі з динамічним масивом та іншими колекціями Java для досягнення оптимальної продуктивності та ефективності в розробці програмного забезпечення.
👉 Якщо у вас залишилися запитання про ArrayList в Java, то сміливо ставте їх у коментарях нижче!