我在学校被告知,修改一个索引变量是一个不好的做法for loop:
示例:
for(int i = 0 ; i < limit ; i++){
if(something){
i+=2; //bad
}
if(something){
limit+=2; //bad
}
}
Run Code Online (Sandbox Code Playgroud)
参数是一些编译器优化可以优化循环,而不是重新计算索引并在每个循环中绑定.
我已经进行了一些测试,java似乎默认索引和绑定每次都会重新计算.
我想知道是否有可能激活这种功能JVM HotSpot?
例如,优化这种循环:
for(int i = 0 ; i < foo.getLength() ; i++){ }
Run Code Online (Sandbox Code Playgroud)
无需写:
int length = foo.getLength()
for(int i = 0 ; i < length ; i++){ }
Run Code Online (Sandbox Code Playgroud)
这只是一个例子,我很想尝试看到改进.
编辑
根据Peter Lawrey的回答,为什么在这个简单的例子中JVM没有内联getLenght()方法?:
public static void main(String[] args) {
Too t = new …Run Code Online (Sandbox Code Playgroud) 我在进行函数调用时试图找到for-each循环的工作方式。请参阅以下代码,
public static int [] returnArr()
{
int [] a=new int [] {1,2,3,4,5};
return a;
}
public static void main(String[] args)
{
//Version 1
for(int a : returnArr())
{
System.out.println(a);
}
//Version 2
int [] myArr=returnArr();
for(int a : myArr)
{
System.out.println(a);
}
}
Run Code Online (Sandbox Code Playgroud)
在版本1中,我在for-each循环中调用returnArr()方法,在版本2中,我显式调用returnArr()方法并将其分配给数组,然后对其进行迭代。两种方案的结果都相同。我想知道哪个更有效以及为什么。
我认为版本2会更高效,因为我不会在每次迭代中都调用method。但是令我惊讶的是,当我使用版本1调试代码时,我看到方法调用只发生过一次!
谁能解释一下它是如何工作的?当我为复杂对象编写代码时,哪个更有效/更好?