数组声明是线性时间运算还是恒定时间运算?

时间:2019-05-18 20:26:50

标签: java time-complexity big-o jvm-hotspot

boolean[] arr = new boolean[n];

上述初始化的时间复杂度是多少?是O(1)还是O(n)?我认为它是O(1),因为该程序只是向JVM请求大小为n的内存块。在这种情况下,JVM(热点)如何实际分配内存?

到目前为止,我已经查看了以下链接,但是答案对我来说还不清楚:

Thread-1 Thread-2

1 个答案:

答案 0 :(得分:2)

我认为通常 O(n),因为声明的数组必须为零且具有默认值,在您的情况下为false

但是,VM也可以证明该数组不会立即读取,也就是说,有人首先向其中写入所有元素,并且只有在那个之后才读取它们。在这种情况下,复杂度将为O(1),因为您实际上并没有做任何事情(数组本身内部没有默认值),因此是恒定的。

例如,这是通过{:{1}}通过以下方式在java-11中发生的事情:

Collection::toArray

因此,当您遇到类似情况时:

default <T> T[] toArray(IntFunction<T[]> generator) {
    return toArray(generator.apply(0));
} 

该实现实际上将执行List.of(1, 2, 3, 4) .toArray(x -> new Integer[x]); 并将其与某些new Integer[0]结合使用,而不是推断的System.arrayCopy。这样做是因为VM可以prove不需要调零,因此可以完全跳过它。