У меня есть быстрый вопрос о том, как ListIterators (и, я думаю, итераторы в целом) выполняют на Java. Например, связанный список (стандартный стандарт Java), если я получаю ListIterator для него, выполняет ли он весь список для его создания? Я использую это, чтобы реализовать довольно стандартную хеш-таблицу, и я беспокоюсь, что использование итератора в отличие от написания моего собственного собственного класса затрудняет мою работу O (n) всегда, в отличие от худшего ,Спецификации реализации Java - ListIterator
ответ
Здание ListIterator
не перебирает List
. По сути, это просто инициализация текущей позиции в списке.
И эта позиция обновляется каждый раз, когда вы звоните .next()
.
Пример реализации в LinkedList
private class ListItr implements ListIterator<E> {
private Node<E> lastReturned = null;
private Node<E> next;
private int nextIndex;
private int expectedModCount = modCount;
ListItr(int index) {
// assert isPositionIndex(index);
next = (index == size) ? null : node(index);
nextIndex = index;
}
public boolean hasNext() {
return nextIndex < size;
}
public E next() {
checkForComodification();
if (!hasNext())
throw new NoSuchElementException();
lastReturned = next;
next = next.next;
nextIndex++;
return lastReturned.item;
}
private class Itr implements Iterator<E> {
int cursor; // index of next element to return
int lastRet = -1; // index of last element returned; -1 if no such
int expectedModCount = modCount;
public boolean hasNext() {
return cursor != size;
}
@SuppressWarnings("unchecked")
public E next() {
checkForComodification();
int i = cursor;
if (i >= size)
throw new NoSuchElementException();
Object[] elementData = ArrayList.this.elementData;
if (i >= elementData.length)
throw new ConcurrentModificationException();
cursor = i + 1;
return (E) elementData[lastRet = i];
}
Это не требуется, что построения Iterator
свободен. Представьте себе дерево. Итерацию над ним можно реализовать, создав сначала линейное представление, а затем итерируя этот список. (Я не знаю о такой реализации, хотя) Это было бы O (N) для построения, O (1) per .next()
В качестве альтернативы вы могли бы искать следующий элемент каждый раз: это был бы O (log N) для каждого .next()
, но O (1) для создания. (Java TreeMap
делает это)
Другой вариант - построить стек/кучу узлов, которые нужно посетить, когда вы идете. Этот подход используется в TreeTraverser Гуавы. Должно быть O (1) на .next()
и O (1) для инициализации.
интересные примеры, но я не уверен, где происходят некоторые из варов, таких как размер? Я считаю, что это более справедливо для иллюстративных целей и псевдокодов .. – Opentuned
- 1. Java ListIterator Performance
- 2. Как использовать суперкласс итератор() в реализации listIterator()?
- 3. java: сброс ListIterator?
- 4. Java ListIterator осветление
- 5. Java LinkedList ListIterator поведение
- 6. Java - ListIterator и hasNext
- 7. Справка по реализации шаблона спецификации
- 8. Использование ListIterator с LinkedList (Java)
- 9. Проблемы с listiterator удалить java
- 10. Спецификации интерфейсов J2SE и реализации этих интерфейсов
- 11. Интерфейс java является аналогом спецификации java?
- 12. Java - Бесконечная петля с ListIterator .hasNext()
- 13. Как Java находит реализацию спецификации?
- 14. Какой класс непосредственно реализует ListIterator?
- 15. Обход спецификации исключения java ...?
- 16. Java библиотеки спецификации
- 17. ListIterator предыдущий метод не работает
- 18. Реализации WS-Discovery для Java
- 19. Есть ли улучшенная альтернатива реализации Java CopyOnWriteArrayList и как я могу запросить изменение спецификации Java?
- 20. сравнить элементы в ListIterator
- 21. ListIterator, делающий ошибку
- 22. Метод Previous() класса ListIterator
- 23. listIterator не работает
- 24. ListIterator в предыдущей() метод
- 25. Как эффективно использовать ListIterator?
- 26. Circular Doubly LinkedList ListIterator
- 27. ConcurrentModificationException сохраняется даже с ListIterator
- 28. Нет ListIterator в LinkedHashMap и LinkedHashSet
- 29. Ошибка в примере спецификации Java?
- 30. Разъяснение от спецификации Java Janguage
Как вы используете Список, чтобы «реализовать стандартную хеш-таблицу»? Как связаны списки и хеш-таблицы? –
@LutzHorn Стандартная реализация [Hashtable] (http://en.wikipedia.org/wiki/Hash_table) представляет собой массив «хэш-ведер», и каждое ведро является связанным списком. – zapl