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")
就足够了吗?
这可能对你很有意思.对于此代码:
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
.