Java:声明一个大小为n的数组的大时间是什么?

Mal*_*ala 32 java arrays performance complexity-theory

在Java中声明大小为n的数组的运行时间是多少?我想这将取决于内存是否zero'ed出来的垃圾收集(在这种情况下,它可能是O(1)),或在初始化(在这种情况下,它不得不为O(N)).

Viv*_*ath 18

是的O(n).考虑这个简单的程序:

public class ArrayTest {

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

}
Run Code Online (Sandbox Code Playgroud)

生成的字节码是:

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

}
Run Code Online (Sandbox Code Playgroud)

要查看的newarray指令是指令(只是搜索newarray).来自VM规范:

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

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

编辑

查看提供的链接amit,可以在常量时间内使用默认值实现数组初始化.所以我猜它最终取决于JVM.你可以做一些粗略的基准测试,看看是否是这种情况.

  • amit发布了一个链接[@ Jonathan的回答](http://stackoverflow.com/questions/5640850/java-whats-the-big-o-time-of-declaring-an-array-of-size-n/5640892 #5640892)如何在JVM代码中进行延迟初始化.我没有看到如何破坏规范,只要从数组接口的POV(读取和写入)中将数组初始化为正确的值. (4认同)

ami*_*mit 8

关于JRE1.6的小型非专业基准测试:

public static void main(String[] args) {
    long start = System.nanoTime();
    int[] x = new int[50];
    long smallArray = System.nanoTime();
    int[] m = new int[1000000];
    long bigArray = System.nanoTime();
    System.out.println("big:" +  new Long( bigArray - smallArray));
    System.out.println("small:" +  new Long( smallArray - start));


}
Run Code Online (Sandbox Code Playgroud)

给出了以下结果:

big:6133612
small:6159
Run Code Online (Sandbox Code Playgroud)

所以我假设O(n).当然,这还不够确定,但这是一个暗示.

  • @Martijn`O(n/2)`仍然是'O(n)`ie,仍然是线性的:) (4认同)