Java for循环迭代

Raf*_*mal 0 java iterator for-loop

考虑以下代码:

final String str = "1-2-3";

for (int idx = 0; idx < str.split("\\D").length; idx++) {
    // do something
}
Run Code Online (Sandbox Code Playgroud)

这部分代码str.split("\\D")会执行多少次?三次?或者编译器会看到str声明为final,只有一次调用str.split("\\D")就足够了吗?

Ama*_*dan 6

这可能对你很有意思.对于此代码:

class Foo {
  public static void main(String args[]) {
    final String str = "1-2-3";

    for (int idx = 0; idx < str.split("\\D").length; idx++) {
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

字节码是:

Compiled from "Foo.java"
class Foo {
  Foo();
    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        
}
Run Code Online (Sandbox Code Playgroud)

这是一个明确的split执行3层的四倍,无论终局的str,和不变性split.