当前位置: 代码迷 >> java >> Java Iterator是否保留对链表元素的引用?
  详细解决方案

Java Iterator是否保留对链表元素的引用?

热度:83   发布时间:2023-07-18 09:02:20.0

我需要一个列表来保存应用程序中敌人类的几个元素。 这将充当对象池以提高效率,因为否则将经常实例化并杀死该特定类。

到目前为止,我可能将使用链接列表,因为将不活动的元素放在列表的末尾将非常有益。 我的问题是以下内容-在Java中,Iterator是否通过持有对它的引用(对于链接列表)来提供对其要访问的当前元素的直接访问,还是迭代到下一个元素需要Iterator从头开始重新循环(例如,对于for循环(总是需要从链表的开头开始),这无济于事)?

从C的角度来看,我的问题是Iterator是否包含一个指向它正在访问的当前元素的指针,这样它就不必从头开始循环就可以访问。

我已经对此进行了一些研究,但是还没有找到答案。

它没有在Javadoc中记录,但是您可以检查LinkedListlistIterator的实现,并查看它是否确实引用了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的特定索引。

是的,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;
    }
  ...

这将充当对象池以提高效率,因为否则将经常实例化并杀死该特定类。

我不会使用对象池,除非您的对象非常昂贵或被调用很多,例如每秒说一百万次。 注意:使用LinkedList会创建对象以将其添加到列表中,因此您可能没有想到的那么多。

到目前为止,我可能将使用链接列表,因为将不活动的元素放在列表的末尾将非常有益。

LinkedLIst中的构建对此不好,但是可以创建自己的构建。 添加到列表的末尾是昂贵的,但是添加到开头是相对便宜的。 我会这样做,因为顺序无关紧要。

我的问题是以下内容-在Java中,Iterator是否通过持有对它的引用(对于链接列表)来提供对其正在访问的当前元素的直接访问,

是。

还是迭代到下一个元素需要Iterator从头开始重新循环(即,对效率没有帮助)?

也可以

从C的角度来看,我的问题是Iterator是否包含一个指向它正在访问的当前元素的指针,这样它就不必从头开始循环就可以访问。

我根本不会使用迭代器。 这更多的垃圾和开销。 但是,如果需要倒带,则可以与ListIterator一起使用,或者必须创建一个新的Iterator。

迭代到下一个元素是否需要迭代器从头开始再次循环

您可以放心,这并非完全正确, 因为这将是一个如此自杀的决定。 Iterator的全部要点是为顺序访问数据结构提供最佳访问模式。

我还必须添加这一点:从性能和内存的角度来看, ArrayList可以更好地为您服务。 LinkedList所需的额外节点元素会导致大量开销,此外,链表固有的指针追逐访问模式对缓存不友好。

  相关解决方案