gpt4 book ai didi

java - 寻求对java中迭代器的进一步理解

转载 作者:搜寻专家 更新时间:2023-10-31 08:12:43 25 4
gpt4 key购买 nike

如果我使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com