Освоюємо 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[ред.]

LinkedList в Java Зв'язаний список є лінійними структурами даних, де елементи не зберігаються в суміжних місцях, і кожен елемент є окремим об'єктом з частиною даних і частиною адреси. Елементи пов'язані за допомогою покажчиків і адрес. Кожен елемент відомий як вузол. Внаслідок динамічності і простоти вставок і делецій, вони є кращими за масиви. Вона також має кілька недоліків, таких як вузли не можуть бути доступні безпосередньо, а ми повинні почати з голови і слідувати через посилання, щоб дістатися до вузла, який ми хочемо отримати доступ.

Для зберігання елементів у зв'язаному списку використовується подвійно пов'язаний список, який забезпечує лінійну структуру даних, а також використовується для успадкування абстрактного класу та списку реалізації та інтерфейсів deque.

У Java, клас LinkedList реалізує інтерфейс списку. Клас LinkedList також складається з різних конструкторів і методів, таких як інші java колекції.


LinkedList (): Використовується для створення порожнього зв'язаного списку. LinkedList (колекція C): використовується для створення упорядкованого списку, який містить всі елементи зазначеної колекції, повернуті ітератором колекції. // Java-код для реалізації Linked List

import java.util.*;

public class Test {

   public static void main(String args[]) 
   { 
       // Creating object of class linked list 
       LinkedList<String> object = new LinkedList<String>(); 
 
       // Adding elements to the linked list 
       object.add("A"); 
       object.add("B"); 
       object.addLast("C"); 
       object.addFirst("D"); 
       object.add(2, "E"); 
       object.add("F"); 
       object.add("G"); 
       System.out.println("Linked list : " + object); 
 
       // Removing elements from the linked list 
       object.remove("B"); 
       object.remove(3); 
       object.removeFirst(); 
       object.removeLast(); 
       System.out.println("Linked list after deletion: " + object); 
 
       // Finding elements in the linked list 
       boolean status = object.contains("E"); 
 
       if(status) 
           System.out.println("List contains the element 'E' "); 
       else
           System.out.println("List doesn't contain the element 'E'"); 
 
       // Number of elements in the linked list 
       int size = object.size(); 
       System.out.println("Size of linked list = " + size); 
 
       // Get and set elements from linked list 
       Object element = object.get(2); 
       System.out.println("Element returned by get() : " + element); 
       object.set(2, "Y"); 
       System.out.println("Linked list after change : " + object); 
   } 

} Output: Linked list : [D, A, E, B, C, F, G] Linked list after deletion: [A, E, F] List contains the element 'E' Size of linked list = 3 Element returned by get() : F Linked list after change : [A, E, Y]


Methods for Java LinkedList:

add​(int index, E element): This method Inserts the specified element at the specified position in this list.(Цей метод Вставляє вказаний елемент у вказану позицію у цьому списку.)

add​(E e): This method Appends the specified element to the end of this list.(Цей метод додає вказаний елемент до кінця цього списку.)

addAll​(int index, Collection c): This method Inserts all of the elements in the specified collection into this list, starting at the specified position.(Цей метод Вставляє всі елементи зазначеної колекції до цього списку, починаючи з заданої позиції.)

addAll​(Collection c): This method Appends all of the elements in the specified collection to the end of this list, in the order that they are returned by the specified collection’s iterator.(Цей метод Додає всі елементи зазначеної колекції до кінця цього списку в тому порядку, в якому вони повертаються ітератором зазначеної колекції)

addFirst​(E e): This method Inserts the specified element at the beginning of this list.(Цей метод Вставляє вказаний елемент на початку цього списку.)

addLast​(E e): This method Appends the specified element to the end of this list.(Цей метод додає вказаний елемент до кінця цього списку.)

clear​(): This method removes all of the elements from this list.(Цей метод видаляє всі елементи з цього списку.)

clone​(): This method returns a shallow copy of this LinkedList.(Цей метод повертає дрібну копію цього LinkedList.)

contains​(Object o): This method returns true if this list contains the specified element.(Цей метод повертає true, якщо цей список містить вказаний елемент.)

descendingIterator​(): This method returns an iterator over the elements in this deque in reverse sequential order.(Цей метод повертає ітератор над елементами в цьому deque в зворотному порядковому порядку.)

element​(): This method retrieves, but does not remove, the head (first element) of this list.(Цей метод отримує, але не видаляє, голову (перший елемент) цього списку.)

get​(int index): This method returns the element at the specified position in this list.(This method returns the element at the specified position in this list.)

getFirst​(): This method returns the first element in this list.(Цей метод повертає перший елемент у цьому списку.)

getLast​(): This method returns the last element in this list.(Цей метод повертає останній елемент у цьому списку.)

indexOf​(Object o): This method returns the index of the first occurrence of the specified element in this list, or -1 if this list does not contain the element.(Цей метод повертає індекс першого входження зазначеного елемента в цей список, або -1, якщо цей список не містить елемента)

lastIndexOf​(Object o): This method returns the index of the last occurrence of the specified element in this list, or -1 if this list does not contain the element.(Цей метод повертає індекс останнього входження зазначеного елемента в цей список, або -1, якщо цей список не містить елемента.)

listIterator​(int index): This method returns a list-iterator of the elements in this list (in proper sequence), starting at the specified position in the list.(Цей метод повертає список-ітератор елементів у цьому списку (у належній послідовності), починаючи з заданої позиції у списку.)

offer​(E e): This method Adds the specified element as the tail (last element) of this list.(Цей метод Додає вказаний елемент як хвіст (останній елемент) цього списку.)

offerFirst​(E e): This method Inserts the specified element at the front of this list.(Цей метод Вставляє вказаний елемент у передній частині цього списку.)

offerLast​(E e): This method Inserts the specified element at the end of this list.(Цей метод вставляє вказаний елемент у кінець цього списку.)

peek​(): This method retrieves, but does not remove, the head (first element) of this list.(Цей метод отримує, але не видаляє, голову (перший елемент) цього списку.)

peekFirst​(): This method retrieves, but does not remove, the first element of this list, or returns null if this list is empty.(Цей метод отримує, але не видаляє, перший елемент цього списку, або повертає null, якщо цей список порожній.)

peekLast​(): This method retrieves, but does not remove, the last element of this list, or returns null if this list is empty.(Цей метод витягує, але не видаляє, останній елемент цього списку, або повертає null, якщо цей список порожній.

poll​(): This method retrieves and removes the head (first element) of this list.(Цей метод витягує і видаляє голову (перший елемент) цього списку.)

pollFirst​(): This method retrieves and removes the first element of this list, or returns null if this list is empty.(Цей метод витягує і видаляє голову (перший елемент) цієї списки.)

pollLast​(): This method retrieves and removes the last element of this list, or returns null if this list is empty.(Цей метод вилучає і видаляє останній елемент цього списку або повертає null, якщо цей список порожній.)

pop​(): This method Pops an element from the stack represented by this list.(Цей метод виводить елемент зі стека, представленого цим списком.)

push​(E e): This method Pushes an element onto the stack represented by this list.(Цей метод натискає елемент на стек, представлений цим списком.)

remove​(): This method retrieves and removes the head (first element) of this list.(Цей метод витягує і видаляє голову (перший елемент) цього списку.)

remove​(int index): This method removes the element at the specified position in this list.(Цей метод видаляє елемент у вказаній позиції у цьому списку.)

remove​(Object o): This method removes the first occurrence of the specified element from this list, if it is present.(Цей метод видаляє перше входження вказаного елемента з цього списку, якщо він присутній.)

removeFirst​(): This method removes and returns the first element from this list.(Цей метод видаляє і повертає перший елемент з цього списку.)

removeFirstOccurrence​(Object o): This method removes the first occurrence of the specified element in this list (when traversing the list from head to tail).(Цей метод видаляє перший випадок зазначеного елемента в цьому списку (при переході списку від голови до хвоста).)

removeLast​(): This method removes and returns the last element from this list.(Цей метод видаляє і повертає останній елемент з цього списку.)

removeLastOccurrence​(Object o): This method removes the last occurrence of the specified element in this list (when traversing the list from head to tail).(Цей метод видаляє останнє входження зазначеного елемента в цей список (при переході списку від голови до хвоста).)

set​(int index, E element): This method replaces the element at the specified position in this list with the specified element.(Цей метод замінює елемент у зазначеній позиції в цьому списку зазначеним елементом.)

size​(): This method returns the number of elements in this list.(Цей метод повертає кількість елементів у цьому списку.)

spliterator​(): This method Creates a late-binding and fail-fast Spliterator over the elements in this list.(Цей метод створює спліттерaтор з пізнім зв'язуванням і швидким збоєм через елементи цього списку.)

toArray​(): This method returns an array containing all of the elements in this list in proper sequence (from first to last element).(Цей метод повертає масив, що містить всі елементи цього списку, у належній послідовності (від першого до останнього елемента).)

toArray​(T[] a): This method returns an array containing all of the elements in this list in proper sequence (from first to last element); the runtime type of the returned array is that of the specified array.(Цей метод повертає масив, що містить всі елементи цього списку, у належній послідовності (від першого до останнього елемента); тип повертається масиву, що виконується, та його тип.)

HashSet[ред.]

Цей клас реалізує інтерфейс Set, заснований на хеш-таблиці (фактично екземпляр HashMap). Він не дає гарантій щодо порядку ітерації набору; зокрема, це не гарантує, що замовлення залишатиметься постійним з часом. Цей клас дозволяє нульовий елемент. Цей клас не синхронізований. Однак це може бути синхронізовано явно так: Set s = Collections.synchronizedSet (новий HashSet (...))

Примітки щодо HashSet:

HashSet не підтримує жодного замовлення, елементи повертаються в будь-якому випадковому порядку. HashSet не допускає дублікатів. Якщо ви спробуєте додати дубльований елемент у HashSet, старе значення буде перезаписано. HashSet дозволяє null значення, але якщо ви вставите більше одного null, він все одно поверне тільки одне значення null. HashSet не синхронізовано. Ітератор, що повертається цим класом, є швидким, що означає, що ітератор викидає ConcurrentModificationException, якщо HashSet було змінено після створення ітератора, будь-яким способом, крім власного методу видалення ітератора.

HashSet Example

import java.util.HashSet; public class HashSetExample {

  public static void main(String args[]) {
     // HashSet declaration
     HashSet<String> hset = 
              new HashSet<String>();
     // Adding elements to the HashSet
     hset.add("Apple");
     hset.add("Mango");
     hset.add("Grapes");
     hset.add("Orange");
     hset.add("Fig");
     //Addition of duplicate elements
     hset.add("Apple");
     hset.add("Mango");
     //Addition of null values
     hset.add(null);
     hset.add(null);
     //Displaying HashSet elements
     System.out.println(hset);
   }

} Output:

[null, Mango, Grapes, Apple, Orange, Fig]

Як ви можете бачити, всі дубльовані значення не присутні у виводі, включаючи подвійні значення null.

HashSet Methods:

boolean add(Element e): Він додає елемент e до списку. It adds the element e to the list.

void clear():Він видаляє всі елементи зі списку. It removes all the elements from the list.

Object clone():Цей метод повертає дрібну копію HashSet. This method returns a shallow copy of the HashSet.

boolean contains(Object o):Він перевіряє, чи вказаний об'єкт O присутній у списку чи ні. Якщо об'єкт був знайдений, він повертає true ще false. It checks whether the specified Object o is present in the list or not. If the object has been found it returns true else false.

boolean isEmpty():Повертає true, якщо в наборі немає елемента. Returns true if there is no element present in the Set. int size():Це дає кількість елементів множини. It gives the number of elements of a Set.

boolean(Object o):Він видаляє вказаний об'єкт o з набору. It removes the specified Object o from the Set.

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

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

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


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