Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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_Loops - Fatal编程技术网

Java 检查循环中的条件

Java 检查循环中的条件,java,loops,Java,Loops,我想向更有经验的开发人员询问一个简单但对我来说并不明显的问题。假设您有这样一个代码(Java): for(int i=0;i方法调用需要JVM确实执行额外的操作。因此,乍一看,您所做的似乎是一种优化 然而,一些JVM实现足够聪明,可以内联方法调用,对于那些JVM实现,差异将不存在 例如,Android编程指南总是建议您按照您所指出的去做,但是JVM实现手册(如果您能得到一本)会告诉您它是否为您优化了代码。通常size()是一个小的恒定时间操作,因此与执行循环体的成本相比,调用size的成本微不足

我想向更有经验的开发人员询问一个简单但对我来说并不明显的问题。假设您有这样一个代码(Java):


for(int i=0;i方法调用需要JVM确实执行额外的操作。因此,乍一看,您所做的似乎是一种优化

然而,一些JVM实现足够聪明,可以内联方法调用,对于那些JVM实现,差异将不存在

例如,Android编程指南总是建议您按照您所指出的去做,但是JVM实现手册(如果您能得到一本)会告诉您它是否为您优化了代码。

通常
size()
是一个小的恒定时间操作,因此与执行循环体的成本相比,调用
size
的成本微不足道,而即时编译器可能会为您处理此优化;因此,此优化可能没有太多好处

这就是说,这种优化不会对代码可读性产生负面影响,因此不能避免;通常,出于这个原因,应该避免只影响速度一小部分的代码优化(与例如将O(n)操作更改为O(1)操作的优化相反),例如,您可以:

inti;
int vectorsizedVisibleBy4=vectorSize-vectorSize%4;//返回vectorSize中四个值的最低倍数
对于(i=0;i

通过将循环展开四次,您可以将
i
的计算次数减少四倍,但代价是使代码变得不可读(它也可能会弄脏指令缓存,从而导致负面性能影响)。不要这样做。但是,正如我所说,
int vectorSize=vector.size()
不属于这一类,所以请尝试一下。

第一眼看到您建议的备选方案是优化,但就速度而言,它与普通方法相同,因为:

java向量中size()函数调用的复杂度时间为O(1)级,因为每个向量始终存储一个包含其大小的变量,因此您不需要在每次迭代中计算其大小,只需访问它即可

注:
您可以看到大小()函数in:只是返回一个受保护的变量elementCount。

谢谢-我在找到这个问题的答案时遇到了一些问题…有时,你会在循环中修改向量的大小。事先获取大小没有什么错,尤其是在大小调用很昂贵的情况下。但是,向量大小调用并不昂贵。只需理解为什么在开始循环之前要得到大小,并理解为什么要在每次循环迭代后检查大小。但当然,正如lad所怀疑的那样,恒定时间操作比无时间操作需要更多时间。尽管贡献不错;)干杯
for(int i=0; i<vector.size(); i++){
   //make some stuff here
}
int vectorSize = vector.size();
for(int i=0; i<vectorSize; i++){
    //make some stuff here
}
for(int i=0; i<myTreeNode.getChildren().size(); i++){
   //make some stuff here
}
int i;
int vectorSizeDivisibleBy4 = vectorSize - vectorSize % 4; // returns lowest multiple of four in vectorSize
for(i = 0; i < vectorSizeDivisibleBy4; i += 4) {
    // loop body executed on [i]
    // second copy of loop body executed on [i+1]
    // third copy of loop body executed on [i+2]
    // fourth copy of loop body executed on [i+3]
}
for(; i < vectorSize; i++) { // in case vectorSize wasn't a factor of four
    // loop body
}