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

Dzi*_*gas 6 java arrays performance javac

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

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

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

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

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

int noOfElements = array.length;

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

通过这种方式,(据我所知)程序只需计算一次,然后查找'noOfElements'变量的值.

注意:我知道增强的for循环,但是当你想使用正在递增的变量(在这个例子中为'i')来实现for循环中的其他内容时,它不能被使用.

我怀疑这实际上是一个问题,即Java编译器是否能够意识到'array.length'没有改变,并且在计算一次后实际重用该值.

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

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

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

感谢输入的人!

Mar*_*oun 8

JLS- 10.7.数组成员:

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

  • public final 字段 length,包含数组的组件数.length可能是正数或零.

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

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

for(int i : array) {
   ...
} 
Run Code Online (Sandbox Code Playgroud)