Java - 何时使用迭代器?

时间:2010-04-01 00:33:03

标签: java performance architecture iterator

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

我正在读一点,使用Iterator会有很多开销。

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

我应该注意另一项表现权衡吗?在使用迭代器之前,我会读取整个SQL命令字符串以执行到ArrayList中,然后迭代它。如果导入相当大(例如地理定位数据,那么服务器往往会陷入困境)。

沃尔特

2 个答案:

答案 0 :(得分:9)

我认为你的问题是你应该'流'输入而不是将它全部加载到内存和进程中。这不是我想的使用Iterator的问题。

“这取决于”,当然,虽然在你给出的例子中,它听起来像输入输入而不是将它全部加载到内存中是一个明显的胜利,所以迭代确实。

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

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

答案 1 :(得分:1)

  

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

在这种情况下,迭代器的开销可能会因运行查询所花费的时间而相形见绌。

  

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

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

迭代器特别适用于在飞行/懒惰时加载/创建数据的流式传输。它们不要求数据完全在内存中。