Próbowałem dwóch przykładów, jak robisz dla swojego pytania. Na tej podstawie muszę powiedzieć, że drugie podejście byłoby lepsze. (Choć nie jestem rozważa wielowątkowości)
Test.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);
}
}
}
po kompilacji, a następnie ponownie decompiling mam to.
* 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.
}
}
}
}
Test1.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);
}
}
}
po kompilacji, a następnie ponownie decompiling mam to.
/*
* 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.
}
}
}
}
Praca dla studenta: skompilować obie wersje i porównać wyjście kodu bajtowego. Oto referencja; https://docs.oracle.com/javase/7/docs/technotes/tools/windows/javap.html – DwB
Nie sądzę, że to pytanie jest na poziomie ucznia, ale cóż, zastanawiałem się, czy ktoś już zna odpowiedź na to raczej niż mówienie mi, że można spojrzeć na wyjściowy kod bajtowy, o którym wiem, że mogłem. a także, musiałbym spojrzeć na wyjścia także dla Androida. może to być piekło projektu, aby samodzielnie odpowiedzieć na to pytanie. –
Czy kompilator wie, że 'a.bar()' zawsze zwraca tę samą wartość dla danego 'a'? –