内存管理和for循环的速度

fel*_*itz 2 java memory performance loops

我刚刚在一本教科书中读过这篇文章,所以我想知道这是不是真的.

比方说,我们有一个数组,其中包含一些我们想要迭代的值:


for(int x = 0; x < array.length; x++) {
     //some code
}
Run Code Online (Sandbox Code Playgroud)

现在每次跳回到循环的开头,它都必须重新计算数组的长度.因此,本书建议,最好创建一个该长度的整数,并将x与该整数而不是数组长度进行比较.


for(int x = 0, int length = array.length; x < length; x++) {
     //some code
}
Run Code Online (Sandbox Code Playgroud)

因此,根据我的理解,第一个版本显然较慢但节省了内存,而在第二个版本中,我们使用更多的空间来使其更快.但是我在实践中从未见过第二个版本,所以我想知道哪些代码会更好用.

提前致谢!

jas*_*son 7

现在每次跳回到循环的开头,它都必须重新计算数组的长度.

完全不真实.数组长度在Java中存储为数组的一部分.

来自文档:

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

  • public final字段length,包含数组的组件数.长度可以是正数或零.
  • public方法clone,它在类中重写同名方法,Object并且不会抛出任何已检查的异常.clone数组类型方法的返回类型T[]T[].

    多维数组的克隆很浅,也就是说它只创建一个新数组.子阵列是共享的.

  • 所有成员都继承自班级Object; 唯一Object没有继承的clone方法是它的方法.

也:

因此,本书建议,最好创建一个该长度的整数,并x与该整数而不是数组长度进行比较.

这是一本以Java为中心的书吗?如果是这样,立即扔掉它并获得一本新书.得到这个根本错误的东西是关于这本书质量的可怕信号.

  • 如果你使用带有`size()`和`get(index)`的常规for循环迭代`List`,它可能*有帮助.虽然,我不能提出一个示例`List`实现,它具有昂贵的`size()`(可能受益于缓存)和廉价的`get(index)`.无论哪种方式,无论如何你最好还是使用`ListIterator`. (2认同)