如果我评估循环外部数组的大小,运行时效率是否有差异?

时间:2014-12-16 17:23:39

标签: java arrays performance javac

迭代(在此示例中为整数)元素数组的传统方法如下:

int[] array = {5, 10, 15};

for(int i = 0; i < array.length; i++) [
    //do something with array[i]
}

然而,这是否意味着在每次迭代之后&#39; array.length&#39;被重新评估?这样做会不会更有效率? :

int[] array = {5, 10, 15};

int noOfElements = array.length;

for(int i = 0; i < noOfElements; i++) {
    //do something with array[i]
}

通过这种方式,(根据我的理解),程序只需要计算一次,然后查找“noOfElements”的值。变量

注意:我知道增强的for循环,但是当你想要使用正在递增的变量时,它不能被使用(在这个例子中是&#39; i&#39; )在for循环中实现其他东西。

我怀疑这实际上是一个问题,即Java编译器是否有能力实现&#39; array.length&#39;在计算一次后,它不会改变并实际重复使用该值。

所以我的问题是:我写的第一个代码块和第二个代码块的运行时效率是否存在差异?

我从下面的回复中收集的是,当一个数组被实例化时(是正确的单词?),创建一个名为length的实例变量,它等于数组中元素的数量。

这意味着语句array.length与计算无关;它只引用实例变量。

感谢输入的人!

3 个答案:

答案 0 :(得分:8)

请参阅JLS- 10.7. Array Members

  

数组类型的成员是以下所有成员:

     
      
  • public final 字段 length,其中包含组件数   数组。 length可能是正数或零。
  •   

调用array.length是O(1)(常数时间操作 - 它是数组的final成员。)

另请注意,正如评论中所提到的,“传统”方式不一定是您提出的方式。您可以使用for-each loop

for(int i : array) {
   ...
} 

答案 1 :(得分:2)

length是一个字段,因此在检查for循环条件时不会计算。

您的第二个代码块引入了一个表示长度的字段,从而增加了内存使用量(略有增加,但仍然是一个重要因素)。

更进一步,如果要在某个时刻重新创建/重新分配数组,使用不同的值集,则不会更新您的字段,但数组的长度字段会更新。

答案 2 :(得分:1)

length是一个数组的字段,如果调用myArray.length,则不会计算,而是在创建数组时设置它。所以不,在开始for()循环之前将它保存到变量并不是更有效。