- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
如果我使用 for 循环(标准 for 循环,而不是增强的 for 语句),我看不出迭代器如何在搜索集合时提高效率。如果我有这样的声明:
(假设aList是一个通用对象列表,类型为E,nextElement指的是列表中的下一个元素)
for (int index = 0; index < aList.size(); index++){
E nextElement = aList.get(index);
// do something with nextElement...
}
我的 get 方法看起来像这样:
Node<E> nodeRef = head;
for (int i = 0; i < index; i++){
nodeRef = nodeRef.next;
// possible other code
}
这实际上是在列表中搜索,一次搜索一个元素。但是,如果我使用迭代器,它不会执行相同的操作吗?我知道迭代器应该是 O(1) 的速度,但如果它无论如何都必须搜索整个列表,它不是 O(n) 吗?
最佳答案
这主要不是关于效率,IMO。这是关于抽象的。使用索引将您与集合联系起来,这些集合可以有效地检索给定索引的项目(因此它不能很好地与链接列表一起工作,比如说)......并且它不表达你的意思正在尝试做的是遍历列表。
使用迭代器,您可以表达对项目序列进行迭代的想法,无论该序列是否可以轻松索引,无论大小是否事先已知,甚至在它实际上是无限的情况下也是如此。
您的第二个案例仍然是使用递增 索引 的 for
循环编写的,这不是考虑它的惯用方式 - 它应该只是测试是否或者它是否已经到了尽头。例如,它可能是:
for (Node<E> nodeRef = head; nodeRef != null; nodeRef = nodeRef.next)
{
}
现在我们有了正确的抽象:循环表达了我们从哪里开始(头部)、何时停止(当没有更多元素时)以及我们如何从一个元素转到下一个元素(使用 next
字段)。这表达了比“我有一个从 0 开始的计数器,我将在每次迭代中询问特定计数器的值,直到计数器的值大于发生的某个值”更有效地迭代的想法是列表的长度。”
我们相当习惯后一种表达事物的方式,但它并没有像迭代器方法那样真正表达我们的意思。
关于java - 寻求对java中迭代器的进一步理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7088271/
我有这个: const {ops} = getOplogStreamInterpreter(strm); ops.del.subscribe(v => { console.log('delete
我四处搜索,据我所知,POST 表单请求已被限制为 10MB (http://golang.org/src/net/http/request.go#L721)。 如果我要在我的 ServeHTTP 方
我是一名优秀的程序员,十分优秀!