迭代(在此示例中为整数)元素数组的传统方法如下:
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与计算无关;它只引用实例变量。
感谢输入的人!
答案 0 :(得分:8)
数组类型的成员是以下所有成员:
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()
循环之前将它保存到变量并不是更有效。