
3-й семестр / Лекции / 8
.pdfПоэтому пока 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