Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果我在循环外计算数组的大小,运行时效率会有差异吗?_Java_Arrays_Performance_Javac - Fatal编程技术网

Java 如果我在循环外计算数组的大小,运行时效率会有差异吗?

Java 如果我在循环外计算数组的大小,运行时效率会有差异吗?,java,arrays,performance,javac,Java,Arrays,Performance,Javac,迭代(本例中为整数)元素数组的传统方法如下: int[] array = {5, 10, 15}; for(int i = 0; i < array.length; i++) [ //do something with array[i] } int[]数组={5,10,15}; for(int i=0;i

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

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

for(int i = 0; i < array.length; i++) [
    //do something with array[i]
}
int[]数组={5,10,15};
for(int i=0;i
然而,这是否意味着在每次迭代后都会重新计算“array.length”值?这样做不是更有效吗

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

int noOfElements = array.length;

for(int i = 0; i < noOfElements; i++) {
    //do something with array[i]
}
int[]数组={5,10,15};
int noOfElements=array.length;
for(int i=0;i
这样,(据我所知)程序只需计算一次,然后查找'noOfElements'变量的值

注意:我知道增强的for循环,但当您想要使用正在递增的变量(本例中为“I”)来实现for循环中的其他内容时,不能使用它

我怀疑这实际上是一个问题,Java编译器是否有能力实现“array.length”不变,并在计算一次后实际重用该值

所以我的问题是:我写的第一段代码和第二段代码在运行时效率上有差异吗

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

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


感谢大家的输入!

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

请参阅:

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

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

for(int i = 0; i < array.length; i++) [
    //do something with array[i]
}
  • public final
    字段
    长度
    ,其中包含组件的数量 数组的长度。
    长度可以是正或零
调用
array.length
是O(1)(恒定时间操作-它是
数组的最终成员)

另外请注意,如评论中所述,“传统”方式不一定是您建议的方式。您可以使用:


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

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


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

传统的数组循环方式是(T:T[])
。让编译器进行微优化。最好是你……投票支持采取额外步骤,并指出OP的方法实际上会更糟的原因。