Java:什么是循环中更快的拆分或之前执行的操作

Tho*_*ues 0 java performance split loops

Goolge提出了很多比较,但不是我想要的:

如果我想迭代分裂的String,那会更好

String[] flagArr = flags.split(";");
for (String f: flagArr) {
    // some stuff
}
Run Code Online (Sandbox Code Playgroud)

要么

for (String f: flags.split(";")) {
    // some stuff
}
Run Code Online (Sandbox Code Playgroud)

使用第二代代码,我想知道编译器是否足够聪明,只能进行一次拆分

Jan*_*yka 5

这完全没关系.不要浪费时间进行这种类型的优化.

编辑:如果你想关心这样的事情,你可能会使用第二个选项,因为带有分割的数组将只存在于for循环范围内.


Mar*_*elo 5

你可以检查生成的字节码,但我很确定他们都会做同样的事情.为什么第二个会有所不同?

编辑:正如你所看到的,两种方式只能调用split()一次.

第一个字节码:

public class javatesting.JavaTesting extends java.lang.Object{
public javatesting.JavaTesting();
  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:   astore_1
   3:   aload_1
   4:   ldc     #3; //String ;
   6:   invokevirtual   #4; //Method java/lang/String.split:(Ljava/lang/String;)
[Ljava/lang/String;
   9:   astore_2
   10:  aload_2
   11:  astore_3
   12:  aload_3
   13:  arraylength
   14:  istore  4
   16:  iconst_0
   17:  istore  5
   19:  iload   5
   21:  iload   4
   23:  if_icmpge       41
   26:  aload_3
   27:  iload   5
   29:  aaload
   30:  astore  6
   32:  aconst_null
   33:  astore  6
   35:  iinc    5, 1
   38:  goto    19
   41:  return

}
Run Code Online (Sandbox Code Playgroud)

而第二个字节码:

public class javatesting.JavaTesting extends java.lang.Object{
public javatesting.JavaTesting();
  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:   astore_1
   3:   aload_1
   4:   ldc     #3; //String ;
   6:   invokevirtual   #4; //Method java/lang/String.split:(Ljava/lang/String;)
[Ljava/lang/String;
   9:   astore_2
   10:  aload_2
   11:  arraylength
   12:  istore_3
   13:  iconst_0
   14:  istore  4
   16:  iload   4
   18:  iload_3
   19:  if_icmpge       37
   22:  aload_2
   23:  iload   4
   25:  aaload
   26:  astore  5
   28:  aconst_null
   29:  astore  5
   31:  iinc    4, 1
   34:  goto    16
   37:  return

}
Run Code Online (Sandbox Code Playgroud)