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


迭代

元素数组(在本例中为整数(的传统方法如下:

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

但是,这是否意味着在每次迭代后都会重新评估"array.length"?这样做不是更有效率吗?:

int[] array = {5, 10, 15};
int noOfElements = array.length;
for(int i = 0; i < noOfElements; i++) {
    //do something with array[i]
}

这样,(据我所知(程序只需要计算一次,然后查找"noOfElements"变量的值。

注意:我知道增强的for循环,但是当您想使用递增的变量(在本例中为"i"(来实现for循环中的其他事情时,无法使用它。

我怀疑这实际上是一个问题,即Java编译器是否能够实现"array.length"不会改变,并在计算一次后实际重用该值。

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

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

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

感谢您的输入!

参见JLS-10.7。数组成员

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

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

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

另请注意,如评论中所述,"传统"方式不一定是您提议的方式。您可以使用 for-each 循环:

for(int i : array) {
   ...
} 
length是一个

字段,因此在检查 for 循环条件时不计算。

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

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

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

最新更新