【问题标题】:Array Length in Java - Performance [duplicate]Java中的数组长度-性能[重复]
【发布时间】:2014-02-26 17:13:40
【问题描述】:

假设我创建了一个长度为 10 的整数数组,即

int[] array = new int[10];

在我的代码中,我想比较一个 int 变量(我们称之为 var)的值与数组的长度。

我想知道这段代码是否:

if(var == array.length) { // stuff }

还有这段代码:

if(var == 10) { // stuff }

做同样的事情,也有同样的表现。

换句话说,我想知道 JVM (?) 用于查找数组长度的内部机制(我没有说“返回”,因为长度是一个字段,而不是一个方法)。它是否利用迭代?因为如果是这样,那么第二段代码会比第一段更快。

编辑:关于 array.length 成本的类似问题(尽管更多地关注它在 for 循环中的使用):

What is the Cost of Calling array.length

【问题讨论】:

  • 永远不要使用第二个。始终使用第一个。 Magic numbers are bad.
  • (JIT) 编译器会对此进行优化。
  • @SotiriosDelimanolis 总的来说,你是对的,但在我的代码中,这不是问题,真的。从性能的角度来看?
  • 我可能弄错了,但逻辑规定当数组长度改变时该字段会更新 (;))。因此,查找数组长度不需要任何迭代,因为该字段已经包含数字。
  • @CoolBeans 我没有检查这个,因为它是关于二维数组(即一个表)。我去看看,说不定能找到什么。

标签: java arrays


【解决方案1】:

.length 是一个属性,所以它肯定不会进行迭代。尽管如此,该属性的值自然会在运行时获取,这意味着第二种解决方案会更快一些(因为这是与常量比较)。

仍然是第一个实现更可取:

  • 这使您的代码更易于维护
  • 您只能在一处更改数组的长度
  • 除非您在一秒钟内经历数百万次,否则您永远不会感受到性能差异。

编辑顺便说一句,您可以自己告诉这是一个属性 - 调用后没有大括号。我至少不知道在 java 中有一种方法可以使属性访问进行额外的计算,而只是检索它的值。

【讨论】:

  • +1 的好答案,它突出了概念的所有方面!谢谢!
  • @PeterHiggs 当然,谢谢。另外请注意我的编辑,我认为这将帮助您在未来解决类似的情况。
  • 是的,我会的!我是编程新手,有时会遇到一些容易回答且与基本概念有关的问题,但至少一旦我从错误中吸取教训,我通常不会重复它们! :)
【解决方案2】:

.length 是数组的属性,而不是函数。因此,结果将立即可用,无需迭代。

【讨论】:

  • 这是我最初的想法,但我想确定一下,因为我有一些运行速度比预期慢得多的代码,我想找出原因!好吧,array.length 显然不是问题!谢谢!
  • @PeterHiggs Java 聊天室愿意提供帮助吗?
  • @Jan Dvorak 是的,我想我会在 Java 聊天中讨论我的性能问题以及如何优化我的代码的性能。
  • @Jan Dvorak 已经在群里上传了,喜欢的可以看看:filetea.me/t1sLLgTRgRbTGizbpbc5e1EYQfiletea.me/t1seyU1k5P7Q5qxx1JMP9iKTg
【解决方案3】:

来自Java Doc

数组类型的成员都有以下几种:

公共最终字段长度,包含组件的数量 的数组。长度可以是正数或零。

length 是数组的最后一个字段,因此在编写以下代码时不需要迭代。

if(var == array.length) { // stuff }

这确实是一种很好的编码习惯。

【讨论】:

    【解决方案4】:

    数组的长度属性是在常数 (O(1)) 时间内提取的 - 不需要迭代。使用它也是一个好习惯。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-19
      • 1970-01-01
      • 2022-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-13
      相关资源
      最近更新 更多