![在Java中迭代数组的最快方法:循环变量vs语句增强[重复],第1张 在Java中迭代数组的最快方法:循环变量vs语句增强[重复],第1张](/aiimages/%E5%9C%A8Java%E4%B8%AD%E8%BF%AD%E4%BB%A3%E6%95%B0%E7%BB%84%E7%9A%84%E6%9C%80%E5%BF%AB%E6%96%B9%E6%B3%95%EF%BC%9A%E5%BE%AA%E7%8E%AF%E5%8F%98%E9%87%8Fvs%E8%AF%AD%E5%8F%A5%E5%A2%9E%E5%BC%BA%5B%E9%87%8D%E5%A4%8D%5D.png)
如果您要遍历数组,没关系-增强的for循环无论如何都会使用数组访问。
例如,考虑以下代码:
public static void main(String[] args){ for (String x : args) { System.out.println(x); }}当反编译时,
javap -c Test我们得到(用于
main方法):
public static void main(java.lang.String[]); Code: 0: aload_0 1: astore_1 2: aload_1 3: arraylength 4: istore_2 5: iconst_0 6: istore_3 7: iload_3 8: iload_2 9: if_icmpge 31 12: aload_1 13: iload_3 14: aaload 15: astore 4 17: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream; 20: aload 4 22: invokevirtual #3; //Method java/io/PrintStream.println:(Ljava/lang/String;)V 25: iinc 3, 1 28: goto 7 31: return
现在将其更改为使用显式数组访问:
public static void main(String[] args){ for (int i = 0; i < args.length; i++) { System.out.println(args[i]); }}这反编译为:
public static void main(java.lang.String[]); Code: 0: iconst_0 1: istore_1 2: iload_1 3: aload_0 4: arraylength 5: if_icmpge 23 8: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream; 11: aload_0 12: iload_1 13: aaload 14: invokevirtual #3; //Method java/io/PrintStream.println:(Ljava/lang/String;)V 17: iinc 1, 1 20: goto 2 23: return
增强的for循环中还有更多设置代码,但它们基本上是在做相同的事情。不涉及迭代器。此外,我希望他们会被JITted甚至更多类似的代码。
建议:如果你真的认为它可能使一个显著差异(这只会 永远 做,如果循环体是绝对微乎其微),那么你应该基准它与您的实际应用。那是唯一重要的情况。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)