Ich habe zwei Beispiele versucht, wie Sie für Ihre Frage tun. Auf dieser Grundlage muss ich sagen, dass der zweite Ansatz besser wäre. (Obwohl Ich erwäge nicht Multi-Threading)
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);
}
}
}
nach dem Kompilieren und dann wieder decompiling ich diese bekam.
* 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);
}
}
}
nach dem Kompilieren und dann wieder decompiling ich diese bekam.
/*
* 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.
}
}
}
}
Arbeit für die Schüler: beide Versionen kompilieren und den Bytecode Ausgabe vergleichen. Hier ist eine Referenz; https://docs.oracle.com/javase/j/docs/technotes/tools/windows/javap.html – DwB
Nun, ich denke nicht, dass diese Frage eine Frage auf Studentenebene ist, aber naja, ich fragte mich, ob jemand die Antwort bereits kennt dazu, anstatt mir zu sagen, dass es möglich ist, auf den Ausgangsbytecode zu schauen, von dem ich weiß, dass ich könnte. und außerdem würde ich die Ausgaben für Android auch betrachten müssen. Das kann ein höllisches Projekt sein, um diese Frage selbst zu beantworten. –
Kann der Compiler wissen, dass 'a.bar()' immer den gleichen Wert für ein gegebenes 'a' liefert? –