当前位置: 首页 > 面试题库 >

在Java中迭代数组的最快方法:循环变量vs语句增强[重复]

诸葛利
2023-03-14
问题内容

在Java中,以老式的方式遍历数组是否更快,

for (int i = 0; i < a.length; i++)
    f(a[i]);

或者使用更简洁的形式,

for (Foo foo : a)
    f(foo);

对于ArrayList,答案是否相同?

当然,对于大量的应用程序代码,答案是没有明显的区别,因此应使用更简洁的形式以提高可读性。但是,我正在研究的上下文是重型技术计算,必须执行数十亿次操作,因此即使很小的速度差异也可能会变得非常重要。


问题答案:

如果您要遍历数组,没关系-增强的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]);
    }
}

这反编译为:

html" target="_blank">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甚至更多类似的代码。

建议:如果你真的认为它可能使一个显著差异(这只会 永远 做,如果循环体是绝对微乎其微),那么你应该基准它与您的实际应用。那是唯一重要的情况。



 类似资料:
  • 问题内容: 我被要求在我的编码中使用增强循环。 我只学习了如何使用传统循环,因此不知道它和增强循环之间的区别。 增强循环与Java中的传统循环有何不同? 有什么复杂的地方我应该注意哪些教程往往不提? 问题答案: 增强的for循环: 传统的for循环

  • 本文向大家介绍java增强for循环的实现方法,包括了java增强for循环的实现方法的使用技巧和注意事项,需要的朋友参考一下 如下所示: Map并没有实现Iterable接口,所以你不能直接使用增强for来遍历它! 以上就是小编为大家带来的java增强for循环的实现方法的全部内容了,希望对大家有所帮助,多多支持呐喊教程~

  • 本文向大家介绍Java中增强for循环在一维数组和二维数组中的使用方法,包括了Java中增强for循环在一维数组和二维数组中的使用方法的使用技巧和注意事项,需要的朋友参考一下 一维数组: 输出:1 2 3 二维数组: 输出: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 以上就是小编为大家带来的Java中增强for循环在一维数组和二维数组中的使用方法的全部内容了,希望对大家有所帮助,

  • 问题内容: 谁能告诉我Java +5中Enhanced for loop和Iterators的优点是什么? 问题答案: Stephen Colebourne(Joda- Time,JSR-310等)对优点和缺点进行了很好的总结,针对每个循环迭代控制建议进行了增强,以在Java 7中进行扩展: 功能概要: 扩展Java 5 for-each循环,以允许访问循环索引(无论是第一次还是最后一次迭代),并

  • 问题内容: 我有一个关于变量范围的相当简单的问题。 我对增强型循环很熟悉,但是我不明白为什么我应该声明一个新变量来保留每个元素。一个例子可以澄清我的问题: 那为什么要声明这个新变量呢?毕竟在for循环内是可访问的。我不想使用任何先前的值,只是不想声明一个新变量。(我猜想对于其他可迭代项,使用相同变量可能会更快)。 我想这就是增强型循环的构建方式,但这不会破坏整个范围的想法吗? 上述行为引起了一个问