Java中迭代数组的最快方法:循环变量vs增强for语句

Java中迭代数组的最快方法:循环变量vs增强for语句,java,performance,iteration,Java,Performance,Iteration,在Java中,以旧式方式迭代数组是否更快 for (int i = 0; i < a.length; i++) f(a[i]); 对于ArrayList来说,答案是一样的吗 当然,对于大量的应用程序代码,答案是它没有明显的区别,因此为了可读性,应该使用更简洁的形式。然而,我所关注的环境是繁重的技术计算,操作必须执行数十亿次,因此即使是很小的速度差异也可能最终变得非常显著。这完全属于计算机领域。这真的没关系。在风格上,我总是更喜欢第二个,因为它更简洁,除非你需要循环计数器来做其他事

在Java中,以旧式方式迭代数组是否更快

for (int i = 0; i < a.length; i++)
    f(a[i]);
对于ArrayList来说,答案是一样的吗


当然,对于大量的应用程序代码,答案是它没有明显的区别,因此为了可读性,应该使用更简洁的形式。然而,我所关注的环境是繁重的技术计算,操作必须执行数十亿次,因此即使是很小的速度差异也可能最终变得非常显著。

这完全属于计算机领域。这真的没关系。在风格上,我总是更喜欢第二个,因为它更简洁,除非你需要循环计数器来做其他事情。这比这种微观优化更重要:可读性


也就是说,对于ArrayList来说没有太大区别,但是LinkedList与第二个相比效率更高。

衡量它。所有性能问题的答案都取决于虚拟机版本、处理器、内存速度、缓存等。因此,您必须针对特定平台进行测量


就我个人而言,我更喜欢第二种变体,因为其意图更加明确。如果性能出现问题,我可以在以后对其进行优化—如果代码对整个应用程序的性能非常重要。

对于阵列或随机访问收集,您可以通过执行以下操作略微提高速度:

List<Object> list = new ArrayList<Object>();

for (int i=0, d=list.size(); i<d; i++) {
    something(list.get(i));
}
List List=new ArrayList();

for(int i=0,d=list.size();i如果在数组中循环,这应该无关紧要-增强的for循环无论如何都会使用数组访问

例如,考虑这个代码:

public static void main(String[] args)
{
    for (String x : args)
    {
        System.out.println(x);
    }
}
使用
javap-c Test
反编译时,我们得到(对于
main
方法):

现在将其更改为使用显式数组访问:

public static void main(String[] args)
{
    for (int i = 0; i < args.length; i++)
    {
        System.out.println(args[i]);
    }
}
在增强的for循环中有更多的设置代码,但它们基本上都在做相同的事情。不涉及迭代器。此外,我希望它们能够适应更相似的代码


建议:如果您真的认为它可能会带来显著的不同(只有在循环体非常小的情况下才会如此),那么您应该用实际应用程序对其进行基准测试。这是唯一重要的情况。

更快的是使用fork-join框架的ParallelArray(如果数据集足够大)。

对于LinkedList:

for(ClassOfElement element : listOfElements) {
  System.out.println(element.getValue());
}
以前曾得到答复:


它不会对数组使用迭代器。第一种样式限制为Integer.MAX迭代次数,而第二种样式则不限制。第二种样式也受此限制,因为数组的元素数为MAX Integer.MAX_VALUE,而ArrayList由数组支持。这已经被证明是正确的。为什么不运行基准测试呢?比测试更准确这不是一个数组。在内部的“提问之前”中,将使用foreach循环创建一个迭代器,而在这里它不会根据这里的答案创建。除非
f()
非常短。从技术上讲,这确实是一个不同的问题。数组和列表之间存在差异。因此,技术实现不同,可能会导致不同的结果。Jon Skeet的答案对于数组来说很好。
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(ClassOfElement element : listOfElements) {
  System.out.println(element.getValue());
}