Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 会不会";“计数限制”;for循环的表达式只能计算一次,还是每次迭代都要计算?_Java_Loops_Methods_For Loop_Call - Fatal编程技术网

Java 会不会";“计数限制”;for循环的表达式只能计算一次,还是每次迭代都要计算?

Java 会不会";“计数限制”;for循环的表达式只能计算一次,还是每次迭代都要计算?,java,loops,methods,for-loop,call,Java,Loops,Methods,For Loop,Call,如果我在循环的条件语句中调用一个方法,每次循环迭代都会调用它吗 例如: for( int i = 0; i <= expensiveComputation(); i++ ) { // Do something. } 它将在每次迭代时被调用,除非编译器/优化器确定它没有副作用,并且可能会将调用作为优化来消除 我的意思是,编译器不能盲目地存储值,因为java中的函数与数学函数不同,它不仅可以有返回值,还可以有一些副作用,如将某些内容打印到某个流或更改某些全局状态等 编译器不能在每次迭

如果我在循环的条件语句中调用一个方法,每次循环迭代都会调用它吗

例如:

for( int i = 0; i <= expensiveComputation(); i++ ) {
    // Do something.
}

它将在每次迭代时被调用,除非编译器/优化器确定它没有副作用,并且可能会将调用作为优化来消除

我的意思是,编译器不能盲目地存储值,因为java中的函数与数学函数不同,它不仅可以有返回值,还可以有一些副作用,如将某些内容打印到某个流或更改某些全局状态等

编译器不能在每次迭代中忽略调用还有另一个原因。函数不接受任何参数这一事实并不意味着它每次都必须返回相同的值。例如,它可以从流中输入一个数字并返回,也可以随机生成一个数字


因此,编译器需要非常小心才能安全地消除调用。因此,如果函数很昂贵,您肯定应该预先存储它的值。

是的,您应该在这些情况下缓存结果,以确保更好的性能。

第二个选项更好,特别是在不需要在每次迭代时计算的情况下


如果你假设你的循环长度是n,你的计算是O(n)。
对于第一个解决方案,复杂度是O(n2),而另一个是O(2n)

它可能在每次迭代中被调用,也可能不被调用,这取决于编译器想要发出的字节码。事实上,它很可能每次都会被调用

如果您想确保在每次迭代中都不会调用它,那么请使用
intmax=…
版本


为什么不自己测试一下呢?

谢谢,我从来没想过会这样按照同样的思路,您是否会说:for(Object obj:getAllObjects()){}将在每次迭代中重新获取一个新集合?@BARNZ:Hmm。。那不一样。foreach循环确实不同。我认为在foreach循环的情况下,它不会每次迭代都这样做。但我不确定中给出了增强型for语句的“desugared”版本,并表明它不会在每次迭代中计算表达式:
表达式(在本例中为
getAllObjects()
)只出现在等效的basic for循环的
ForInit
部分,该循环只计算一次,这里的Java编译器没有那么多选择。如果发生任何优化,则由Hotspot JIT编译器在运行时执行。
int max = expensiveComputation();
for ( int i = 0; i <= max; i++ ) {
    // Do something.
}