array.length的运行时是什么?

时间:2014-02-06 21:21:05

标签: java

假设我有一个数组:

int[] array = new int[10];

什么是运行时:

int len = array.length;

我认为这将是一个固定的时间操作,但今天在采访中,采访者告诉我这将是O(n),因为需要计算元素的数量。

另外,如果我有这样的循环:

for (int i = array.length - 1; i >=0; i--) {
    something with array[i];
}

这是否需要额外的n操作才能到达数组的末尾以启动循环?面试官来自C背景,所以也许他们错误地认为Java是如何运作的,但我不想在采访中推动它。

3 个答案:

答案 0 :(得分:9)

array.length是O(1)并且循环总体上是O(n)(假设“某事物”是恒定时间)。

  

c有什么不同?

C的不同之处在于,根据数组的分配方式,您可以在O(1)时间内查找其大小,或者根本不查找。 “完全没有”,我的意思是你必须自己跟踪尺寸。

(就个人而言,如果那是采访者的能力,我会对去那里工作有所保留。)

答案 1 :(得分:0)

这是解释array.length实现的另一个SO线程:

How is length implemented in Java Arrays?

调用length属性是一个O(1)操作,因为它实际上不计算数组,在创建数组时设置该字段。

另一方面,你的循环是O(n)操作。

答案 2 :(得分:0)

这是所有JAVA实现中的常量操作,因为JVM必须存储此字段以检查索引(如果索引无效,则必须抛出IndexOutOfBoundsException)。

在本地变量中缓存数组长度可能是一个好主意,因为JVM堆栈访问速度更快但这种改进非常小,通常循环体执行会超重此优化。