第一的:
int x;
for (int i = 0; i < MAX; i++){
// some magic with x
System.out.println(x);
}
第二:
for (int i = 0; i < MAX; i++){
int x;
// some magic with x
System.out.println(x);
}
那么哪段代码更好,更高效?
第一的:
int size = array.length;
for (int i = 0; i < size; i++) {
// do something with array[i]
}
第二:
for (int i = 0; i < array.length; i++) {
// do something with array[i]
}
将数组长度保存为变量是否更有效?
1.在这里您应该更加关注的不是效率,而是范围。通常,您应该努力使变量尽可能在本地范围内。这意味着,如果仅在循环内需要x,则应在循环内定义x。
通过使变量尽可能在本地范围内,您会获得许多好处:
您可以从Josh Bloch的出色著作“ Effective Java ”(有关作用域的第13和45节中讨论)中了解更多有关可变范围和最佳实践的信息。您可能还想阅读第55项,其中讨论了明智地进行优化的重要性。
2.对于问题的第二部分,请参见此处的The Skeet答案。
这是一个例子:
public static void main(String[] args) {
for(int i=0; i<getSize(); i++) {
System.out.println("i: " + i);
}
}
private static int getSize() {
int size = new Random().nextInt(10);
System.out.println("size: " + size);
return size;
}
输出:
size: 2
i: 0
size: 4
i: 1
size: 4
i: 2
size: 8
i: 3
size: 0
注意getSize()
循环的每次迭代如何调用。在您的示例中,调用.length
不会有太大的区别,因为JIT运行时将知道如何优化此调用。但是想象一下,这getSize()
是一个更复杂的操作,例如计算数据库表中的行数。您的代码将非常慢,因为循环的每次迭代都会调用getSize()
,从而导致数据库往返。
在这种情况下,您最好事先进行评估。您可以这样做,并且仍然保留的最小范围size
,如下所示:
public static void main(String[] args) {
for(int size = getSize(), i=0; i<size; i++) {
System.out.println("i: " + i);
}
}
private static int getSize() {
int size = new Random().nextInt(10);
System.out.println("size: " + size);
return size;
}
size: 5
i: 0
i: 1
i: 2
i: 3
i: 4
注意如何getSize()
仅被调用一次,并且size
变量仅在循环内可用,并且在循环完成后就超出范围。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句