关于这件事,我和我的朋友发生了争执。考虑下面的代码片段,
for(i=0; i<someList.size(); i++) {
//some logic
}
在这里,每次迭代都会执行someList.size()
,因此建议将此大小计算迁移到循环外部(在循环之前)。
现在,当我使用像这样的扩展for循环时,
for(SpecialBean bean: someBean.getSpecialList()) {
//some logic
}
是否有必要将someBean.getSpecialList()
移到循环之外?如果我保留第二个代码片段,someBean.getSpecialList()
将执行多少次?
发布于 2012-08-28 09:10:12
出自Joshua Bloch在Effective Java中的项目46 :
版本1.5中引入的
-each循环通过完全隐藏迭代器或索引变量,消除了混乱和出错的机会。由此产生的习惯用法同样适用于集合和数组:
//迭代集合和数组的首选习惯用法是(Element e: elements) { doSomething(e);}当您看到冒号(:)时,将其读作“in”。因此,上面的循环读作“for each element e in elements”。请注意,使用for-each循环不会造成性能损失,即使对于数组也是如此。事实上,在某些情况下,与普通的for循环相比,它可能会提供轻微的性能优势,因为它只计算一次数组索引的限制。虽然您可以手动完成此操作(第45项),但程序员并不总是这样做。
另请参阅is-there-a-performance-difference-between-a-for-loop-and-a-for-each-loop
发布于 2012-08-28 09:07:37
for each
变体将如下所示
for (Iterator i = c.iterator(); i.hasNext(); ) {
doSomething((Element) i.next());
}
来自项目46:首选for-each循环,而不是Effective的传统for循环
与传统的
循环相比,for-each循环在清晰度和错误预防方面提供了引人注目的优势,并且没有性能损失。你应该在你能用的地方使用它。
所以我的第一个猜测是错误的,在for each
循环中使用函数没有惩罚。
发布于 2012-08-28 09:10:00
第一个代码段的替代方法是:
for(i=0, l=someList.size(); i<l; i++) {
//some logic
}
关于for..each循环,对getSpecialList()
的调用将只进行一次(您可以通过在方法中添加一些调试/日志记录来验证这一点)。
https://stackoverflow.com/questions/12155987
复制相似问题