コンパイラが何かを最適化するかどうかを確認する 100% 確実な方法があります。コンパイル結果を見てください。私は応答にバイトコードを含めましたが、それはかなり明白だと思います-分割メソッドは、最後のキーワードに関係なく、最初のケースで複数回実行されます(invoke virtual 行は分割メソッド呼び出しです。 goto ステートメントによってループされます)。
ただし、異なるコンパイラは異なる方法で動作する場合があります。ご希望の環境で自由に再テストしてください ('javap -c classname' でバイトコードを表示できます)
public class gti {
public static void main ( String[] args ) {
final String str = "1-2-3";
for (int idx = 0; idx < str.split("\\D").length; idx++) {
// do something
}
}
}
結果:
public class gti {
public gti();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: iconst_0
1: istore_2
2: iload_2
3: ldc #2 // String 1-2-3
5: ldc #3 // String \D
7: invokevirtual #4 // Method java/lang/String.split:(Ljava/lang/String;)[Ljava/lang/String;
10: arraylength
11: if_icmpge 20
14: iinc 2, 1
17: goto 2
20: return
}
その間
public class gti {
public static void main ( String[] args ) {
final String str = "1-2-3";
int length = str.split("\\D").length;
for (int idx = 0; idx < length; idx++) {
// do something
}
}
}
結果:
public class gti {
public gti();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: ldc #2 // String 1-2-3
2: ldc #3 // String \D
4: invokevirtual #4 // Method java/lang/String.split:(Ljava/lang/String;)[Ljava/lang/String;
7: arraylength
8: istore_2
9: iconst_0
10: istore_3
11: iload_3
12: iload_2
13: if_icmpge 22
16: iinc 3, 1
19: goto 11
22: return
}