Освоюємо Java/Колекції

Матеріал з Вікіпідручника
Перейти до: навігація, пошук

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

Структура колекцій[ред.]

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

Collection – базовий інтерфейс, крім нього на його основі в структурі колекцій є ще декілька інтерфейсів, які розширюють базовий інтерфейс Collection. Зокрема, List, Set та SortedSet. Окремо виділяють ще інтерфейс Map. Він не походить на пряму від інтерфейсу Collection, проте його також відносять до колекцій. На їх основі створено набір класів, які згодяться програмістам для більшості випадків роботи з набором об’єктів. Тож вам не прийдеться самим їх реалізовувати.

Якщо вам цікаво, для чого стільки різних класів в колекціях? Суть в тому, що різні класи по різному реалізовують роботу з даними. Одні класи швидше здійснюють читання даних, інші вставлення і видалення, одні перевіряють, щоб не було дублювань, інші дозволяють вставляти дані за певним ключем і т.п. Доволі важливо підібрати клас, який найкраще підходить для вашого завдання і забезпечить найбільшу швидкодію. Особливо це актуально, коли кількість об’єктів величезна.

Клас ArrayList та використання ітератора[ред.]

Клас ArrayList призначений для читання об'єктів по індексу. Тож не дарма у назві є слово Array (масив). Після створення колекції на основі ArrayList, прочитати дані можна кількома способами. Наступний приклад демонструє створення ArrayList, його наповнення об'єктами типу String та їх читання за допомогою методу get (int index) та за допомогою ітератора.

import java.util.ArrayList;
import java.util.ListIterator;

public class TestArrayList {

    private ArrayList<String> a1;

    public static void main(String[] args) {
        TestArrayList test = new TestArrayList();
        test.create();
        test.getData();
        test.iterateData();
    }

    void create() {
        //створюємо і наповнюємо ArrayList
        a1 = new ArrayList<String>();
        a1.add("Привіт");
        a1.add("тобі");
        a1.add("божевільний");
        a1.add("світе!");
    }

    //читаємо дані по індексу
    void getData() {
        for (int i = 0; i < a1.size(); i++) {
            System.out.print(a1.get(i) + " ");
        }
    }

    //Читаємо вміст ArrayList з допомогою ітератора 
    void iterateData() {
        ListIterator<String> it = a1.listIterator();
        while (it.hasNext()) {
            System.out.print(it.next() + " ");
        }
    }
}

Результат:

Привіт тобі божевільний світе! Привіт тобі божевільний світе!

Крім вищенаведених способів можна передати вміст ArrayList у звичайний масив за допомогою методу toArray(). Якщо ви хочете детально розібратися з ArrayList і його методами, то для цього також дивіться інформацію про інтерфейси Collection, List та Iterator.

Окремо розглянемо перегляд даних з допомогою ітератора.

ListIterator<String> it=a1.listIterator();

Таким чином створюється об’єкт ітератора, посилання на який передається об'єктній змінній it типу ListIterator. ListIterator – це інтерфейс, який розширює інтерфейс Iterator декількома новими методами. Базовими ж методами інтерфейсу Iterator є ті, що використані у нас в програмі, а саме:

  • boolean hasNext() – повертає true, якщо ітерація має наступний елемент
  • E next() - повертає наступний елемент ітерації (буква E вказує, що це може бути елемент будь-якого типу, детальніше див. розділ Узагальнення)
  • void remove() – знищує останній елемент, що повертався ітератором

Тож у коді бачимо:

		while(it.hasNext()){
			System.out.print(it.next()+" "); 
		}

Цикл працює поки є елементи в ітераторі. Перевірка здійснюється за допомогою методу hasNext. А вивід елементів здійснюється за допомогою методу next. Перевірка за допомогою hasNext необхідна через те, що в разі відсутності наступного елементу при виклику методу next буде викинуто виняток NoSuchElementExeption.

Інтерфейсом ListIterator передбачено ще такі методи як add, hasPrevious, next, nextIndex, previous, previousIndex, set. Назви методів говорять самі за себе. Детальніше ви можете подивитися в документації по інтерфейсу ListIterator.

Клас Itr, який реалізовує інтерфейс ListIterator є внутрішнім класом класу AbstractList. ArrayList є нащадком класу AbstractList.

Для того, щоб ітератор міг працювати з певним об’єктом, клас даного об’єкту повинен реалізовувати інтерфейс Iterable:

public interface Iterable<E>
{
   Iterator<E> iterator();
}

Інтерфейс Collection розширює даний інтерфейс.

Можна також перебрати елементи за допомогою перевантаженого з виходом java 5 циклу for (так званого “for each”):

	for (String str : a1) {
		System.out.print(str+" "); 
	}

При компіляції даний цикл перетворюється компілятором у цикл із ітератором.

Якщо ви погано розумієте вищенаведений приклад і як усе працює зверніться до розділів, що описують основні концепції об’єктно-орієнтованого програмування і, зокрема, розберіть детально теми інтерфейсів, абстрактних класів та поліморфізму.

LinkedList[ред.]

(ще не написано)

HashSet[ред.]

(ще не написано)

Алгоритми[ред.]

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

Додаткова література[ред.]


Графічний інтерфейс користувача · Менеджери розташування