Колекції в Java. Частина 1: ArrayList та LinkedList

Java є однією з найпопулярніших мов програмування, і однією з основних причин є її потужна і гнучка система колекцій. У світі програмування, колекції – це об’єкти, які групуються разом. В Java колекції – це більше, ніж просто структури даних: вони стали фундаментом для створення більш складних додатків. Детальний розбір та розуміння колекцій в Java є необхідним для будь-якого Java розробника, адже вони є важливим інструментом для ефективної роботи з даними.

Визначення та важливість колекцій в Java

Колекції в Java – це фреймворк, який надає архітектуру для зберігання та маніпулювання групами об’єктів. Вони включають інтерфейси, які надають абстрактні типи даних для представлення колекцій, та класи, які надають реалізацію цих інтерфейсів.

Використання колекцій в Java надає ряд переваг. Вони допомагають в ефективному управлінні даними, виконують маніпуляції з даними, такі як пошук, сортування, вставка, оновлення та видалення. Більше того, вони зменшують зусилля програміста, автоматизуючи процеси обробки даних, і покращують продуктивність та якість коду.

Огляд основних типів колекцій у Java

Java Collections Framework включає в себе ряд інтерфейсів та класів. Основні типи колекцій в Java включають:

  • List: Це інтерфейс, який представляє колекцію, що зберігає елементи в визначеному порядку та дозволяє дублювання. Основні класи, що реалізують List, включають ArrayList, LinkedList та Vector.
  • Set: Це інтерфейс, який представляє колекцію, що не допускає дублювання. HashSet, LinkedHashSet та TreeSet – основні класи, що реалізують Set.
  • Map: Це інтерфейс, який представляє об’єкт, що зберігає пари ключ/значення. Це не є справжній член колекцій, але він є частиною Java Collections Framework. HashMap, TreeMap, LinkedHashMap та Hashtable – основні класи, що реалізують Map.
  • Queue: Це інтерфейс, який представляє колекцію, призначену для обробки елементів перед видаленням. PriorityQueue, Deque, и ArrayDeque – основні класи, що реалізують Queue.

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

Що таке інтерфейс Collection в Java

Інтерфейс Collection в Java є основою, на якій базується Java Collections Framework. Він декларує основні методи, які доступні всім колекціям, та є найвищим інтерфейсом в ієрархії колекцій. Інтерфейс Collection реалізований інтерфейсами Set, List, Queue і Deque, і він включає методи для роботи з колекціями, включаючи операції додавання, видалення, перебігу, перевірку розміру та інше.

Опис головних методів інтерфейсу Collection

  • boolean add(E e): додає елемент до колекції
  • boolean addAll(Collection<? extends E> c): додає всі елементи вказаної колекції до поточної колекції.
  • void clear(): видаляє всі елементи з колекції.
  • boolean contains(Object o): повертає true, якщо колекція містить вказаний елемент.
  • boolean containsAll(Collection<?> c): повертає true, якщо колекція містить всі елементи вказаної колекції.
  • boolean isEmpty(): повертає true, якщо колекція порожня.
  • Iterator<E> iterator(): повертає ітератор для колекції.
  • boolean remove(Object o): видаляє одне входження вказаного елемента з колекції, якщо він існує.
  • boolean removeAll(Collection<?> c): видаляє всі елементи вказаної колекції з поточної колекції.
  • boolean retainAll(Collection<?> c): видаляє всі елементи з поточної колекції, крім тих, що знаходяться в вказаній колекції.
  • int size(): повертає кількість елементів у колекції.
  • Object[] toArray(): повертає масив, що містить всі елементи колекції.

Як використовувати колекції: загальні приклади

Ось декілька прикладів використання методів колекцій:


Collection collection = new ArrayList<>();
collection.add("Apple");    // додаємо елемент "Apple" до колекції
collection.add("Banana");   // додаємо елемент "Banana" до колекції
System.out.println(collection.size());  // друкуємо розмір колекції (2)

Collection anotherCollection = new ArrayList<>();
anotherCollection.addAll(collection);   // додаємо всі елементи з collection до anotherCollection
System.out.println(anotherCollection.contains("Apple"));  // повертаємо true, тому що "Apple" є в anotherCollection
anotherCollection.clear();  // видаляємо всі елементи з anotherCollection
System.out.println(anotherCollection.isEmpty()); // повертаємо true, тому що anotherCollection порожній

Ці приклади показують, як можна використовувати різні методи інтерфейсу Collection для маніпуляцій з колекціями в Java.

Що таке ArrayList та його особливості

ArrayList – це реалізація інтерфейсу List в Java, яка використовує масив для зберігання елементів. Основні особливості ArrayList:

  1. Динамічний: ArrayList може динамічно змінювати розмір, що робить його зручним для використання, коли кількість елементів змінюється в ході виконання програми.
  2. Можливість зберігання будь-якого типу об’єктів: ArrayList може зберігати будь-який тип об’єктів, а не лише одного типу.
  3. Підтримка прохідного циклу: ArrayList можна легко перебирати за допомогою циклу for-each.
  4. Підтримка випадкового доступу: Доступ до будь-якого елементу ArrayList можна отримати за константний час, завдяки випадковому доступу.

Методи ArrayList

Основні методи ArrayList включають наступні:

  1. boolean add(E e): додає елемент в кінець цього списку.
  2. void add(int index, E element): вставляє вказаний елемент у цей список за вказаним індексом.
  3. boolean contains(Object o): повертає true, якщо цей список містить вказаний елемент.
  4. E get(int index): повертає елемент, який знаходиться на вказаному індексі в цьому списку.
  5. int indexOf(Object o): повертає індекс першого входження вказаного елемента в цьому списку, або -1, якщо цей список не містить елемента.
  6. E remove(int index): видаляє елемент за вказаним індексом.
  7. E set(int index, E element): замінює елемент, який знаходиться на вказаному індексі, вказаним елементом.
  8. int size(): повертає кількість елементів у цьому списку.

Приклади використання ArrayList

Ось приклад створення і використання ArrayList:


ArrayList fruits = new ArrayList<>();
fruits.add("Apple");    // додаємо "Apple" до списку
fruits.add("Banana");   // додаємо "Banana" до списку
System.out.println(fruits.size());  // друкуємо розмір списку (2)
System.out.println(fruits.get(0));  // друкуємо перший елемент списку ("Apple")
fruits.set(0, "Peach");  // замінюємо перший елемент списку на "Peach"
fruits.remove(1);  // видаляємо другий елемент списку
System.out.println(fruits.contains("Banana"));  // повертаємо false, тому що "Banana" було видалено

Ці приклади показують, як можна використовувати різні методи ArrayList для роботи зі списком в Java.

Що таке LinkedList та його особливості

LinkedList в Java – це реалізація інтерфейсу List і Deque (двобічна черга), яка використовує декілька зв’язаних вузлів для зберігання елементів. Кожен вузол у LinkedList містить даний елемент та посилання на наступний та попередній вузли, що дозволяє здійснювати ефективні вставки та видалення в будь-якому місці списку. Також, відсутність фіксованого розміру дозволяє динамічно змінювати розмір списку.

Методи LinkedList

LinkedList включає в себе різноманітні методи для роботи зі списком. Ось деякі з них:

  • add(E e): додає елемент в кінець списку.
  • addFirst(E e): вставляє вказаний елемент на початку цього списку.
  • addLast(E e): вставляє вказаний елемент в кінець цього списку.
  • getFirst(): повертає перший елемент цього списку.
  • getLast(): повертає останній елемент цього списку.
  • removeFirst(): видаляє та повертає перший елемент цього списку.
  • removeLast(): видаляє та повертає останній елемент цього списку.

Приклади використання LinkedList

Ось приклад створення та використання LinkedList:


LinkedList animals = new LinkedList<>();
animals.add("Dog");
animals.addFirst("Cat");
animals.addLast("Bird");

System.out.println(animals.getFirst()); // виводить "Cat"
System.out.println(animals.getLast()); // виводить "Bird"

animals.removeFirst(); // видаляє "Cat"
animals.removeLast(); // видаляє "Bird"

System.out.println(animals.getFirst()); // виводить "Dog", оскільки "Dog" зараз єдиний елемент у списку

Ці приклади демонструють використання LinkedList для додавання, видалення та отримання елементів у різних місцях списку.

Опис основних відмінностей між ArrayList і LinkedList

ArrayList і LinkedList обидва реалізують інтерфейс List в Java, але мають відмінності в своїй внутрішній структурі та поведінці.

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

З іншого боку, LinkedList використовує двобічно зв’язний список, що означає, що вставка або видалення елементів може відбуватись швидко в будь-якому місці списку, але доступ до конкретного елементу може бути повільним, оскільки це вимагає проходження через список від початку або кінця до потрібного елемента.

Коли краще використовувати ArrayList або LinkedList

Зазвичай, ArrayList краще використовувати, коли вам потрібен швидкий доступ до елементів по індексу, а ви не плануєте часто вставляти або видаляти елементи в середині списку.

LinkedList краще використовувати, коли вам потрібно часто вставляти або видаляти елементи, особливо в середині списку, а доступ до елементів по індексу не є критично важливим.

Порівняльна таблиця

КритерійArrayListLinkedList
Внутрішня структураДинамічний масивДвобічно зв’язний список
Доступ до елементівШвидкийПовільний
Вставка та видалення елементівПовільний (особливо в середині списку)Швидкий
Пам’ятьВикористовує менше пам’ятіВикористовує більше пам’яті (додаткові витрати на зберігання посилань на наступний і попередній вузли)

Site Footer