我需要一个列表来在应用程序中保存Enemy类的几个元素。这将作为一个对象池来提高效率,因为这个特定的类本来会被实例化并经常被杀掉。
到目前为止,我可能会使用链表,因为将非活动元素放到列表末尾非常有用。我的问题如下 - 在Java中,Iterator是否通过保持对它的引用(对于链表)提供对它正在访问的当前元素的直接访问,或者迭代到下一个元素需要迭代器从头开始循环(即没有帮助效率,比如一个for循环,它总是需要回到链接列表的开头)?
从C的角度来看,我的问题是Iterator是否包含指向它正在访问的当前元素的指针,因此它不必从头开始循环以获得访问权。
我对此做了一些研究,但我找不到答案。
答案 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
所需的额外节点元素会产生很大的开销,除此之外,链接列表固有的指针访问访问模式对缓存不友好。