这是java中循环的有用优化吗?

Ofe*_*Ron 5 java optimization android

考虑以下 :

1.

    for (final Bar a : bars) {
        for (final Foo f : foos) {
            doSomethingWith(f.foo(), a.bar());
        }
    }
Run Code Online (Sandbox Code Playgroud)

并且:

2.

    for (final Bar a : bars) {
        final Object bar = a.bar();
        for (final Foo f : foos) {
            doSomethingWith(f.foo(), bar);
        }
    }
Run Code Online (Sandbox Code Playgroud)

这种优化真的很有用,或者编译器会自动执行吗?

如果bar()是吸气剂,你的答案会改变吗?(例如getBar())

如果我的目标是Android开发,你的答案会改变吗?

Vik*_*yap 1

我按照你针对你的问题所做的尝试了两个例子。在此基础上我必须说第二种方法会更好。(虽然我不考虑多线程

测试.java

public class Test{

    public static void main(String... args){

        String[][] arr2 = new String[5][5]; 
        for (final String[] obj : arr2)
        {
            for (final String str : obj)
            System.out.println(str.length() +" " + obj.length); 
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

编译然后再次反编译后我得到了这个。

 * Decompiled with CFR 0_114.
 */
import java.io.PrintStream;

public class Test {
    public static /* varargs */ void main(String ... arrstring) {
        String[][] arrstring2;
        String[][] arrstring3 = arrstring2 = new String[5][5];
        int n = arrstring3.length;
        for (int i = 0; i < n; ++i) {
            String[] arrstring4;
            for (String string : arrstring4 = arrstring3[i]) { //assignment will take place m*n.
                System.out.println("" + string.length() + " " + arrstring4.length);
             //this arrstring4.length will execute m*n (in this case).So, this will less efficient than others.
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

测试1.java

public class Test1{

    public static void main(String... args){

        String[][] arr2 = new String[5][5]; 
        for (final String[] obj : arr2)
        {
            int value = obj.length;
            for (final String str : obj)
                System.out.println(str.length() +" " + value); 
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

编译然后再次反编译后我得到了这个。

/*
 * Decompiled with CFR 0_114.
 */
import java.io.PrintStream;

public class Test1 {
    public static /* varargs */ void main(String ... arrstring) {
        String[][] arrstring2;
        for (String[] arrstring3 : arrstring2 = new String[5][5]) {
            int n = arrstring3.length;  //Assignment will take place M times only.
            //this will calculate M times only. So, it will definitely faster than above. 
            for (String string : arrstring3) { 
                System.out.println("" + string.length() + " " + n);
               //here n is calculate M times but can be printed M*N times.
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)