boolean[] arr = new boolean[n];
上述初始化的时间复杂度是多少?是O(1)还是O(n)?我认为它是O(1),因为该程序只是向JVM请求大小为n的内存块。在这种情况下,JVM(热点)如何实际分配内存?
到目前为止,我已经查看了以下链接,但是答案对我来说还不清楚:
答案 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不需要调零,因此可以完全跳过它。