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

时间:2015-07-30 14:57:37

标签: java pointers object iterator

我需要一个列表来在应用程序中保存Enemy类的几个元素。这将作为一个对象池来提高效率,因为这个特定的类本来会被实例化并经常被杀掉。

到目前为止,我可能会使用链表,因为将非活动元素放到列表末尾非常有用。我的问题如下 - 在Java中,Iterator是否通过保持对它的引用(对于链表)提供对它正在访问的当前元素的直接访问,或者迭代到下一个元素需要迭代器从头开始循环(即没有帮助效率,比如一个for循环,它总是需要回到链接列表的开头)?

从C的角度来看,我的问题是Iterator是否包含指向它正在访问的当前元素的指针,因此它不必从头开始循环以获得访问权。

我对此做了一些研究,但我找不到答案。

4 个答案:

答案 0 :(得分:6)

Javadoc中没有记录,但你可以查看LinkedList listIterator的实现,看看它是否包含对当前和下一个元素的引用列表:

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指向List的特定索引它的构建。

答案 1 :(得分:1)

是的,LinkedList中使用的Iterator实现保留了对下一个和之前元素的引用,以便进行有效的迭代。

Java是开源的,您可以自己查看代码。 Here's the Linked List Iterator code code

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;
    }
  ...

答案 2 :(得分:1)

  

这将作为一个对象池来提高效率,因为这个特定的类本来会被实例化并经常被杀掉。

我不会使用对象池,除非你的对象非常昂贵或被称为很多,比如说每秒一百万次。注意:使用LinkedList会创建对象以将其添加到列表中,因此您可能无法按照您的想法进行保存。

  

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

LinkedLIst中的构建对此并不好,但创建自己的可能会起作用。添加到列表的末尾是昂贵的,但添加到开始是相对便宜的。我会这样做,因为订单无关紧要。

  

我的问题如下 - 在Java中,Iterator是否提供对它正在访问的当前元素的直接访问,方法是保存对它的引用(对于链接列表),

  

或迭代到下一个元素是否需要迭代器从头开始循环(即无效率)?

也是。

  

从C的角度来看,我的问题是Iterator是否包含指向它正在访问的当前元素的指针,因此它不必从头开始循环以获得访问权。

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

答案 3 :(得分:1)

  

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

你可以放心,这不是真正的,因为这将是一个如此自杀的设计决定。 Iterator的重点是允许顺序访问数据结构的最佳访问模式。

我还必须补充一点:从性能和内存的角度来看,ArrayList可以提供更好的服务。 LinkedList所需的额外节点元素会产生很大的开销,除此之外,链接列表固有的指针访问访问模式对缓存不友好。