Java for循环最佳实践

Mar*_*ier 8 java arrays for-loop coding-style

当您需要索引时,循环数组的最佳方法是什么?

选项1:

int len = array.length;
for (int i = 0; i < len; ++i) {
    array[i] = foo(i);
}
Run Code Online (Sandbox Code Playgroud)

选项2:

for (int i = 0; i < array.length; i++) {
    array[i] = foo(i);
}
Run Code Online (Sandbox Code Playgroud)

或者,这没关系?或者有更好的方法吗?只是指出差异:在一种情况下,数组的长度作为循环中测试的一部分进行评估,尽管编译器通常应优化它.


其次,++i这里有什么不同i++吗?我绝对更喜欢++i它是C++,但我不确定Java.

Dan*_*Dan 6

i++vs ++i在这种特殊情况下并不重要.虽然C大师会告诉你将array.length存储在一个变量中,但现代优化编译器在这种情况下只要长度不会在循环中发生变化就不必要了.如果你真的担心你可以对两者进行基准测试,但是因为.length每次你没事,实际上并不需要遍历整个数组.


ars*_*jii 6

通常这两种方法是等价的.你应该注意到

for (int i = 0 ; i < foo() ; i++) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

foo()每次迭代前被调用一次(而不是只有一次的第一次迭代之前),所以你可能想也许做这样的事情来考虑这一点对于更复杂的情况

int n = foo();
for (int i = 0 ; i < n ; i++) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

这与您的选项1类似.所以我认为选项1肯定比两者更安全,但大多数时候它不会产生显着的差异你使用.


至于你的第二个问题:++i首先递增你的变量,然后检索它的值,i++首先检索值然后递增.试试这两段代码:

int i = 0;
System.out.println(++i);
------------------------
int i = 0;
System.out.println(i++);
Run Code Online (Sandbox Code Playgroud)

第一次打印1但第二次打印0.当然,当++ii++独自一人没有区别.