3-й семестр / Лекции / 8 - Презентация
.pdfЦентрдистанционногообучения
Различия между ListIterator и индексом
•У ListIterator есть методы nextIndex и previousIndex,
которые возвращают значения индексов, связанные с объектами, которые будут возвращаться при вызове методов next или previous
•У класса LinkedList есть метод ListIterator (int индекс)
•возвращает ListIterator, чей вызов next возвращает элемент на следующей позиции индекса
online.mirea.ru
Центрдистанционногообучения
Производительность ArrayList и LinkedList
LinkedList обеспечивает лучшую производительность в следующих случаях:
1.При операциях добавления/удаления элементов в начале списка по индексу.
2.При операциях добавления/удаления элементов внутри списка по итератору (при условии, что этот итератор был каким-то образом получен заранее).
3.При доступе к первому/последнему элементу списка (getFirst() / getLast() / removeFirst() / removeLast() и т.д.)
Во многих остальных случаях ArrayList показывает более высокую производительность.
online.mirea.ru
Центрдистанционногообучения
Производительность ArrayList и LinkedList
•LinkedList надо что-то вставить в середину в какую-то
позицию Х, то он будет прямо с начала по ссылкам искать эту позицию. С LinkedList надо использовать, к примеру, ListIterator, который умеет вставлять в середину списка по индексу (поэтому в LinkedList вставка на самом деле будет за мизерное постоянное время).
Пример:
ListIterator<Integer> iter = list.listIterator(inputIndex); iter.add(new Integer(123));
Поэтому пока ArrayList будет перемещать в памяти элементы для вставки, LinkedList давно уже будет сидеть и спокойно курить в сторонке
online.mirea.ru
Центрдистанционногообучения
Производительность ArrayList и LinkedList
•Например, такая ситуация, в ArrayList и в LinkedList объемом
1 000 000 элементов надо сделать 100 вставок в середину по индексу 500 000.
1)Как себя будет вести ArrayList: он 100 раз будет перемещать правую половину массива!
2)А LinkedList доберется за 1 раз до индекса 500 000 и сделает 100 "мгновенных" вставок.
Вывод: выигрыш у LinkedList будет огромный!
•P.S. Конечно, можно придраться, что мол давайте сделаем массив на 100 нужных для вставки элементов и за 1 вставку засунем в середину того ArrayList. Но вот на практике так не всегда везет и приходится делать 100 вставок!
online.mirea.ru
Центрдистанционногообучения
online.mirea.ru
Центрдистанционногообучения
Для чего нужен Iterable?
•Для обеспечения возможности работы ваших классов или
объектов в выражении for/in необходимо реализовать интерфейс Iterable.
•Есть два основных сценария:
üРасширить существующий класс коллекции, который уже реализует интерфейс Iterable (и, следовательно, уже поддерживает for/in).
üУправлять итерацией вручную, определив свою собственную реализацию Iterable.
online.mirea.ru
Центрдистанционногообучения
• Интерфейстребует, чтобыIterableкаждый класс, который его реализует реализовывал метод – итератор
•Интерфейс Collection расширяет интерфейс Iterable, таким образом, что все классы, которые реализуют интерфейс List (подинтерфейс Collection) обязаны представить реализацию итератора в виде метода
•
public interface Iterable<T> { public Iterator<T> iterator();
}
online.mirea.ru
Центрдистанционногообучения
УдобноИнтерфейсиспользовать дляIterableсвоих собственных классов коллекций использовать цикл for/in.
Чтобы сделать это, ваш класс должен реализовывать интерфейс java.lang.Iterable <E>.
Простой пример:
public class MyCollection<E> implements Iterable<E>{
public Iterator<E> iterator() { return new MyIterator<E>();
}
}
online.mirea.ru
Центрдистанционногообучения
Интерфейс Iterable
Соответствующая реализация скелета класса 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){ |
|
} |
online.mirea.ru |
}
Центрдистанционногообучения
Реализация двусвязного списка
mirea.ru