Java for Loop评估

Koe*_*box 11 java loops

我想知道每次循环周期结束时是否在Java中执行条件评估forwhile循环.

例:

int[] tenBig = new int[]{1,2,3,4,5,6,7,8,9,10};

for(int index = 0;index < tenBig.length;index++){
    System.out.println("Value at index: "+tenBig[index]);
}
Run Code Online (Sandbox Code Playgroud)

index < tenBig.length要执行的每一个循环周期结束的时间?

假设和经验告诉我是的.

我知道在这个例子中它tenBig.length是一个常数,因此不会对性能产生影响.

但我们假设条件操作在不同情况下需要很长时间.我知道合理的做法是将tenBig.length变量分配给变量.

我仍然希望确保每次评估它.

Jon*_*eet 11

是的,它将在循环的每次迭代中逻辑地评估整个中间操作数.当JIT知道更好的情况下,当然,它可以做一些聪明的事情(甚至可能根据循环条件去除循环内的数组边界检查).

请注意,对于JIT不知道的类型,它可能无法像这样特别优化 - 但仍可能内联诸如获取size()的类型ArrayList<T>.

最后,我通常更喜欢增强的for循环以提高可读性:

for (int value : tenBig) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

当然,假设您出于其他原因不需要索引.

  • @Koekiebox:你觉得在那种情况下应该做些什么?把它当作一个空集合?我个人认为NPE是正确的结果. (5认同)
  • 增强的 for 循环有一个显着的改进:根据 JLS,表达式(在您的例子中为“tenBig”)仅计算一次。 (3认同)

T.J*_*der 6

是.具体地,条件部分每个循环体之前执行.因此,完全有可能你永远不会进入循环体.

以你的榜样为例:

for(int index = 0;index < tenBig.lenght;index++) {
    /* ...body... */
}
Run Code Online (Sandbox Code Playgroud)

这是逻辑(非文字)等价物:

int index = 0;
while (index < tenBig.length) { // happens on each loop
    /* ...body... */

    index++;
}
Run Code Online (Sandbox Code Playgroud)