Добавил:
Rumpelstilzchen2018@yandex.ru Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
59
Добавлен:
25.12.2020
Размер:
1.12 Mб
Скачать

Поэтому пока ArrayList будет перемещать в памяти элементы для вставки, LinkedList давно уже будет сидеть и спокойно курить в сторонке.

Например, такая ситуация, в ArrayList и в LinkedList объемом 1 000 000 элементов надо сделать 100 вставок в середину по индексу 500 000. Как себя будет вести ArrayList: он 100 раз будет перемещать правую половину массива!

А LinkedList доберется за 1 раз до индекса 500 000 и сделает 100 "мгновенных" вставок. Вывод: выигрыш у LinkedList будет огромный!

P.S. Конечно, можно придраться, что мол давайте сделаем массив на 100 нужных для вставки элементов и за 1 вставку засунем в середину того ArrayList. Но вот на практике так не всегда везет и приходится делать 100 вставок!

Для чего нужен Iterable?

Для обеспечения возможности работы ваших классов или объектов в выражении for/in необходимо реализовать интерфейс Iterable. Есть два основных сценария:

- расширить существующий класс коллекции, который уже реализует интерфейс Iterable (и, следовательно, уже поддерживает for/in);

- управлять итерацией вручную, определив свою собственную реализацию Iterable.

Интерфейс Iterable

Интерфейс требует, чтобы каждый класс, который его реализует реализовывал метод – итератор. Интерфейс Collection расширяет интерфейс Iterable, таким образом, что все классы, которые реализуют интерфейс List (подинтерфейс Collection) обязаны представить реализацию итератора в виде метода.

public interface Iterable<T> { public Iterator<T> iterator();

}

Удобно использовать для своих собственных классов коллекций использовать цикл for/in. Чтобы сделать это, ваш класс должен реализовывать интерфейс java.lang.Iterable <E>. Простой пример:

public class MyCollection<E> implements Iterable<E>{

public Iterator<E> iterator() { return new MyIterator<E>();

}

}

Соответствующая реализация скелета класса MyIterator:

public class MyIterator <T> implements Iterator<T>

{

public boolean hasNext() { //реализация.

}

public T next() { //реализация...;

}

public void remove() { //реализация...еслиподдерживается .

}}

public static void main(String[] args) { MyCollection<String> stringCollection = new

MyCollection<String>();

for(String string : stringCollection){

}

}

Иерархия Collection

Как ArrayList, так и LinkedList представляют собой коллекцию объектов, на которые можно ссылаться с помощью индекса. Интерфейс

Collection определяет подмножество методов, указанных в интерфейсе

List. Иерархия Collection представлена на рисунке 8.13.

Рисунок 8.13 – Иерархия Collection

Общие характеристики коллекций

Интерфейс Collection определяет набор общих методов. Основные функции включают в себя:

-коллекции растут по мере необходимости;

-коллекции хранят ссылки на объекты;

-коллекции имеют по крайней мере два конструктора.

Реализации интерфейса Queue

PriorityQueue (рисунок 8.14) - единственная прямая реализация интерфейса Queue (не считая LinkedList, который больше является списком, чем очередью). Эта очередь упорядочивает элементы либо по их натуральному порядку (используя интерфейс Comparable), либо с помощью интерфейса Comparator, полученному в конструкторе.

Рисунок 8.14 – Реализации интерфейса Queue