Microsoft Word кл программирование на Java 2020 Зорина docx



Pdf көрінісі
бет61/65
Дата17.10.2023
өлшемі3,23 Mb.
#117230
түріРеферат
1   ...   57   58   59   60   61   62   63   64   65
Интерфейс ListIterator
Ограничения 
Iterator

-
можно только пройти списка в прямом направлении; 
-
обеспечивает только метод удаления. 
Необходимо заранее реализовывать итератор, используя свой собственный 
цикл, если исходное положение не в начале списка. 
ListIterator
(рисунок 


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



Достарыңызбен бөлісу:
1   ...   57   58   59   60   61   62   63   64   65




©emirsaba.org 2024
әкімшілігінің қараңыз

    Басты бет