вівторок, 14 квітня 2020 р.

Клас ArrayList

Клас ArrayList - це по суті динамічний масив посилань на об'єкти. Динамічний означає, що якщо його об'єму недостатньо, то він автоматично змінює свій об'єм при додаванні до нього нових елементів. При потребі можна задати йому потрібний об'єм методом ensureCapacity (). ArrayList дозволяє читати об'єкти як по індексу так і послідовно через ітератор.

Клас ArrayList розширює клас AbstractList та реалізовує інтерфейс List.

Наступний приклад демонструє створення 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
{
   Iterator<E> iterator();
}
Інтерфейс Collection розширює даний інтерфейс.

Можна також перебрати елементи за допомогою перевантаженого з виходом java 5 циклу for (так званого “for each”):
 for (String str : a1) {
  System.out.print(str+" "); 
 }

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

ArrayList можна також перетворити у звичайний масив за допомогою методу toArray():
    String strArray[]= new String[a1.size()];
    strArray=a1.toArray(strArray);
    System.out.println(strArray[0]);
Метод size() дозволяє отримати розмір ArrayList.

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

Немає коментарів:

Дописати коментар