【问题标题】:Java - When to use Iterators?Java - 何时使用迭代器?
【发布时间】:2011-02-03 04:28:41
【问题描述】:

我试图更好地理解何时应该和不应该使用迭代器。对我来说,每当我有大量数据需要迭代时,我都会为它编写一个迭代器。如果它也适用于 Iterator 接口,那么它似乎是一个胜利。

我读到一点,使用迭代器有很多开销。

我使用迭代器的一个很好的例子是遍历一堆 SQL 脚本来一次执行一个查询,读入它,然后执行它。

还有其他我应该注意的性能权衡吗?在我使用迭代器之前,我会读取整个 SQL 命令字符串以执行到一个 ArrayList 中,然后遍历它。如果导入相当大(例如地理定位数据,则​​服务器往往会陷入困境)。

沃尔特

【问题讨论】:

标签: java performance architecture iterator


【解决方案1】:

我认为您的问题是何时应该“流式传输”输入而不是将其全部加载到内存中并对其进行处理。我认为这不是使用Iterator 的问题。

当然,“这取决于”,尽管在您给定的示例中,听起来像流式传输输入而不是将其全部加载到内存中是一个明显的胜利,所以确实要迭代。

加载到内存的好处通常是代码更简单,也许你会从一次将大块加载到内存而不是一次读取位中获得一些好处。 “流式传输”的好处是您可以限制内存需求,并获得与此相关的性能。

作为一个非常粗略的经验法则,我不会将这样的东西加载到内存中,除非我确定它低于 100K 左右。

【讨论】:

  • 感谢您的输入 - 是的,这就是我所了解的以及迭代器的有效性。我喜欢接触不同的方法来解决同样的问题。两者都可以工作,随着文件越来越大,最终迭代器将更加高效,并且不会消耗服务器中的所有内存。
【解决方案2】:

我使用迭代器的一个很好的例子是遍历一堆 SQL 脚本来一次执行一个查询,读入它,然后执行它。

在这种情况下,迭代器的开销可能与运行查询所需的时间相比相形见绌。

在我使用迭代器之前,我会读取整个 SQL 命令字符串以执行到一个 ArrayList 中,然后遍历它。如果导入相当大(例如地理定位数据,则​​服务器往往会陷入困境)。

您需要将它们全部收集到 ArrayList 中的任何特殊原因?您可以在阅读语句时一一执行。

迭代器特别适用于动态/延迟加载/创建数据的流式处理情况。它们不需要预先将数据完全存储在内存中。

【讨论】:

  • 当时我使用了ArrayList,因为我需要保持顺序,并且将SQL命令放入ArrayList中更容易。尽管我使用过迭代器,但我自己之前没有写过,所以我没想过这样写。现在我使用它们的次数多了,使用它似乎是一个完美的场景。
猜你喜欢
  • 1970-01-01
  • 2015-01-21
  • 2016-04-09
  • 2011-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-28
  • 1970-01-01
相关资源
最近更新 更多