Java - 何时使用迭代器?

9

我正在努力更好地理解何时应该使用迭代器以及何时不应该使用它。对我来说,每当我需要迭代大量数据时,我都会为其编写一个迭代器。如果它也适用于迭代器接口,那么它似乎是一种胜利。

我读到了一些关于使用迭代器存在很多开销的内容。

我使用迭代器的一个很好的例子是遍历一堆SQL脚本以逐个查询、读取并执行。

还有其他性能权衡方面我应该注意吗?在使用迭代器之前,我会将要执行的所有SQL命令字符串全部读入ArrayList中,然后对其进行迭代。如果导入的数据相当大(例如地理位置数据),那么服务器往往会变得非常缓慢。

沃尔特


这里已经有一个非常好的答案:https://dev59.com/sHI-5IYBdhLWcg3wZ3UR - Zak
2个回答

9
我认为你的问题是何时应该“流式传输”输入而不是将其全部加载到内存中再处理。我觉得这并不是使用迭代器与否的问题。
当然,“这要看情况”,但在你给出的例子中,似乎将输入流式传输而不是全部加载到内存中是一个明显的胜利,所以确实需要迭代。
将数据加载到内存中的好处通常是代码更简单,也许一次性将大块数据加载到内存中比逐个读取数据块更有效率。 “流式传输”的好处是限制内存需求,并获得与此相关的性能提升。
作为一个非常粗略的经验法则,我不会将任何超过100K左右的数据加载到内存中。

谢谢你的反馈 - 是的,我也想到了迭代器的有效性。我喜欢接触解决相同问题的不同方法。这两种方法都可以工作,随着文件变得越来越大,迭代器最终将更有效,并且不会消耗服务器中的所有内存。 - Walter White

1
一个我使用迭代器的好例子是遍历一堆 SQL 脚本,逐个执行查询,读取它,然后执行它。
在这种情况下,迭代器的开销可能被运行查询所花费的时间所淹没。
在使用迭代器之前,我会将要执行的所有 SQL 命令的字符串读入 ArrayList 中,然后遍历它。如果导入的数据相当大(比如地理位置数据),那么服务器往往会变得非常缓慢。
你有特别的原因需要将它们全部收集到 ArrayList 中吗?你可以边读语句边逐个执行它们。
迭代器特别适用于流式情况,其中数据是按需/惰性加载/创建的。它们不需要将数据完全预先存储在内存中。

我当时使用了ArrayList,因为我需要保持顺序,并且将SQL命令放入ArrayList中更容易。尽管我使用过迭代器,但我从未自己编写过迭代器,所以我没有考虑以那种方式编写它。现在我使用它们更多了,似乎这是使用它的完美场景。 - Walter White

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接