问题描述
我需要一个列表来保存应用程序中敌人类的几个元素。 这将充当对象池以提高效率,因为否则将经常实例化并杀死该特定类。
到目前为止,我可能将使用链接列表,因为将不活动的元素放在列表的末尾将非常有益。 我的问题是以下内容-在Java中,Iterator是否通过持有对它的引用(对于链接列表)来提供对其要访问的当前元素的直接访问,还是迭代到下一个元素需要Iterator从头开始重新循环(例如,对于for循环(总是需要从链表的开头开始),这无济于事)?
从C的角度来看,我的问题是Iterator是否包含一个指向它正在访问的当前元素的指针,这样它就不必从头开始循环就可以访问。
我已经对此进行了一些研究,但是还没有找到答案。
1楼
它没有在Javadoc中记录,但是您可以检查LinkedList
的listIterator
的实现,并查看它是否确实引用了List的当前元素和下一个元素:
public ListIterator<E> listIterator(int index) {
return new ListItr(index);
}
private class ListItr implements ListIterator<E> {
private Entry<E> lastReturned = header;
private Entry<E> next;
private int nextIndex;
private int expectedModCount = modCount;
....
创建ListIterator
时,它仅需要遍历LinkedList(从头开始或从头开始),因为可以在构造ListIterator
请求ListIterator
指向List的特定索引。
2楼
是的,LinkedList中使用的Iterator
实现保留对下一个和上一个元素的引用,以进行有效的迭代。
Java是开源的,您可以自己查看代码。
private class ListItr implements ListIterator<E> {
private Node<E> lastReturned;
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;
}
...
3楼
这将充当对象池以提高效率,因为否则将经常实例化并杀死该特定类。
我不会使用对象池,除非您的对象非常昂贵或被调用很多,例如每秒说一百万次。 注意:使用LinkedList会创建对象以将其添加到列表中,因此您可能没有想到的那么多。
到目前为止,我可能将使用链接列表,因为将不活动的元素放在列表的末尾将非常有益。
LinkedLIst中的构建对此不好,但是可以创建自己的构建。 添加到列表的末尾是昂贵的,但是添加到开头是相对便宜的。 我会这样做,因为顺序无关紧要。
我的问题是以下内容-在Java中,Iterator是否通过持有对它的引用(对于链接列表)来提供对其正在访问的当前元素的直接访问,
是。
还是迭代到下一个元素需要Iterator从头开始重新循环(即,对效率没有帮助)?
也可以
从C的角度来看,我的问题是Iterator是否包含一个指向它正在访问的当前元素的指针,这样它就不必从头开始循环就可以访问。
我根本不会使用迭代器。 这更多的垃圾和开销。 但是,如果需要倒带,则可以与ListIterator一起使用,或者必须创建一个新的Iterator。
4楼
迭代到下一个元素是否需要迭代器从头开始再次循环
您可以放心,这并非完全正确, 因为这将是一个如此自杀的决定。
Iterator
的全部要点是为顺序访问数据结构提供最佳访问模式。
我还必须添加这一点:从性能和内存的角度来看, ArrayList
可以更好地为您服务。
LinkedList
所需的额外节点元素会导致大量开销,此外,链表固有的指针追逐访问模式对缓存不友好。