一尘不染

Java:声明大小为n的数组的大O时间是多少?

java

在Java中声明大小为n的数组的运行时间是多少?我想这将取决于是否在垃圾回收中将内存清零(在这种情况下,内存可能为O(1))或在初始化时(这种情况下,内存必须为O(n))。


阅读 216

收藏
2020-09-08

共1个答案

一尘不染

O(n)。考虑以下简单程序:

public class ArrayTest {

  public static void main(String[] args) {
     int[] var = new int[5];
  }

}

生成的字节码为:

Compiled from "ArrayTest.java"
public class ArrayTest extends java.lang.Object{
public ArrayTest();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   return

public static void main(java.lang.String[]);
  Code:
   0:   iconst_5
   1:   newarray int
   3:   astore_1
   4:   return

}

要看的newarray指令就是指令(只需搜索newarray)。从VM规范:

从垃圾收集堆中分配一个新数组,该数组的组件类型为type且长度计数。对该新数组对象的引用arrayref被推入操作数堆栈。
新数组的每个元素都被初始化为该数组类型的默认初始值(第2.5.1节)。

由于每个元素都已初始化,因此需要O(n)时间。

编辑

查看提供的链接amit,可以在恒定时间内以默认值实现数组初始化。所以我想它最终取决于JVM。您可以进行一些粗略的基准测试,看看是否是这种情况。

2020-09-08