130
7.10) является расширением
Iterator
для преодоления ограничений. Можно
представить Итератор как закладку, которая позиционируется между элементами
связанного списка.
Рисунок 7.10 – Методы интерфейса ListIterator
Сравнение итераторов Iterator и ListIterator.
ListIterator
является подинтерфейсом интерфейса
Iterator
; классы,
которые реализуют
ListIterator
обеспечивают все возможности и кроме того
интерфейс итератора требует меньшего количества методов и может использоваться
для итерации по более общим структурам данных, но только в одном направлении.
Для
Iterator
требуется интерфейс
Collection
, в то время как для
ListIterator
требуется только интерфейс
List.
Различия между итератором ListIterator и индексом.
У
ListIterator
есть методы
nextIndex
и
previousIndex
, которые
возвращают значения индексов, связанные с объектами, которые будут возвращаться
при вызове методов
next
или
previous
. У класса
LinkedList
есть метод
ListIterator
(
int
индекс). Возвращает
ListIterator
, чей вызов
next
131
возвращает элемент на следующей позиции индекса.
Сравнение производительности ArrayList и LinkedList.
LinkedList
обеспечивает лучшую производительность в
следующих
случаях:
-
при операциях добавления/удаления элементов в начале списка по
индексу;
-
при операциях добавления/удаления элементов внутри списка по
итератору (при условии, что этот итератор был каким-то образом получен заранее);
-
при доступе к первому/последнему элементу списка (
getFirst() /
getLast() / removeFirst() / removeLast()
и т.д.). Во многих остальных
случаях
ArrayList
показывает более высокую производительность.
LinkedList
надо что-то вставить в середину в какую-то позицию Х, то он
будет прямо с начала по ссылкам искать эту позицию. С
LinkedList
надо
использовать, к примеру,
ListIterator
, который умеет вставлять в середину
списка по индексу (поэтому в
LinkedList
вставка на самом деле будет за мизерное
постоянное время).
Пример:
ListIterator
iter =
list.listIterator(inputIndex);
iter.add(new Integer(123));
Поэтому пока
ArrayList
будет перемещать в памяти элементы для вставки,
LinkedList
давно уже будет сидеть и спокойно курить в сторонке.
Например, такая ситуация, в
ArrayList
и в
LinkedList
объемом 1 000 000
элементов надо сделать 100 вставок в середину по индексу 500 000. Как себя будет
вести
ArrayList
: он 100 раз будет перемещать правую половину массива!
А
LinkedList
доберется за 1 раз до индекса 500 000 и сделает 100
"мгновенных" вставок. Вывод: выигрыш у
LinkedList
будет огромный!
P.S. Конечно, можно придраться, что мол давайте сделаем массив на 100
нужных для вставки элементов и за 1 вставку засунем в середину того
ArrayList
.
132
Но вот на практике так не всегда везет и приходится делать 100 вставок!
Для чего нужен Iterable?
Для обеспечения возможности работы ваших классов или объектов в
выражении
for/in
необходимо реализовать интерфейс
Iterable
. Есть два
основных сценария:
-
расширить существующий класс коллекции, который уже реализует
интерфейс
Iterable
(и, следовательно, уже поддерживает
for/in
);
-
управлять итерацией вручную, определив свою собственную реализацию
Iterable
.
Достарыңызбен бөлісу: