Java 在检查之前声明for loop limit的好处是什么?

Java 在检查之前声明for loop limit的好处是什么?,java,performance,for-loop,Java,Performance,For Loop,这样做有什么好处(如果有的话): for(inti=0,size=foo.size();i

这样做有什么好处(如果有的话):

for(inti=0,size=foo.size();i

与此相反:

for(inti=0;i


(foo是一个
列表
对象)

好吧,这意味着您只对
size()
进行一次评估,而不是每次迭代一次。从理论上讲,这可能是一个性能上的胜利——计算大小实际上是昂贵的。(例如,您可能有一个链表实现,它不记得它的大小,但实际上必须遍历整个列表。可以说,如果您发现自己处于这种情况,更好的解决方案就是使用更好的数据结构……如果
size()
很昂贵,那么按索引访问也可能很昂贵。)


实际上,标准集合具有非常快速的
size()
方法,因此它通常是不相关的,并且会损害可读性(IMO)。当然,如果您不需要索引,那么使用增强的for循环更具可读性…

因为列表的第一个大小仅计算一次

对于第二种情况,每次在迭代期间计算列表
foo
的大小时

对于我来说,如果每个循环的
foo
列表的类型为
String
i

for(String str: foo){

}

取决于您在for循环中正在做什么。假设您想在已经包含一个或多个元素的Foo列表中添加size元素(好吧,这看起来很愚蠢),第二个循环将导致无限循环,直到您没有更多可用内存,而第一个循环将正确地添加大小元素;因此,答案是:不gain@fge:好吧,您假设
size()
是一种便宜的方法。可能不是。马修沃森:据我所知,这是你的想象。这是一个Java问题,因为我一直在研究它。@assylias并不意味着你不能拥有一个带有昂贵的
size()
函数的
List
。完整地说,你还可以提到任何实现(标记)的对象
RandomAccess
通过索引访问接口实际上比在foreach循环中更快
ArrayList
就是这样一个class@fge当前位置我认为“威尔”在这里是一个强有力的说法
RandomAccess
表明它会很快-不一定比foreach循环快。foreach循环的好处主要在于可读性。感谢您的快速回答。我也这么想,但我想确认一下。我在写atm的程序中需要索引,但如果你不需要索引,这确实是最好的选择index@AdriVanHoudtforeach是用来隐藏迭代器的。为了获得当前迭代,必须执行普通For循环。要了解更多信息,我知道这一点,我只是想了解带有迭代器的For循环的特殊变体。但是谢谢你的回复!