Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 数组声明是线性时间操作还是常数时间操作?_Java_Time Complexity_Big O_Jvm Hotspot - Fatal编程技术网

Java 数组声明是线性时间操作还是常数时间操作?

Java 数组声明是线性时间操作还是常数时间操作?,java,time-complexity,big-o,jvm-hotspot,Java,Time Complexity,Big O,Jvm Hotspot,上述初始化的时间复杂度是多少?是O(1)ir O(n)吗?我认为这是O(1),因为程序只是要求JVM提供大小为n的内存块。在这种情况下,JVM(热点)实际上是如何分配内存的 到目前为止,我已经查阅了以下链接,但我不清楚答案: 我认为一般情况下是O(n),因为声明的数组需要是带有默认值的零,在您使用false的情况下 但是VM也可以证明这个数组不是立即读取的,也就是说,有人首先将所有元素写入该数组,然后才读取它们。在这种情况下,复杂性将是O(1),因为您实际上没有做任何事情(数组本身中没有放置默

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

到目前为止,我已经查阅了以下链接,但我不清楚答案:

我认为一般情况下是
O(n)
,因为声明的数组需要是带有默认值的零,在您使用
false
的情况下

但是VM也可以证明这个数组不是立即读取的,也就是说,有人首先将所有元素写入该数组,然后才读取它们。在这种情况下,复杂性将是
O(1)
,因为您实际上没有做任何事情(数组本身中没有放置默认值),因此是常量

例如,这就是
java-11
中使用
Collection::toArray
排序时发生的情况,通过:

boolean[] arr = new boolean[n];

该实现实际上将执行
新整数[0]
,并将其与一些
System.arrayCopy
结合使用,而不是推断出的
新整数[4]
。这样做是因为VM可以确定不需要调零,因此完全跳过调零

谢谢你,@Eugene的写作和链接。本质上,(数据结构操作的)时间复杂度分析应该意识到,当多项式中的剩余项优于O(n)时,应该考虑任何新的数组声明?这在今天的HotSpot中可能不会发生,但在原则上,当JVM知道新内存已经归零时,它也可能跳过归零。例如,某些操作系统允许在分配新内存时请求调零内存,因为出于安全原因,它们无论如何都在调零页面。@Holger或甚至使用
AlwaysPreTouch
。说得好
default <T> T[] toArray(IntFunction<T[]> generator) {
    return toArray(generator.apply(0));
} 
List.of(1, 2, 3, 4)
    .toArray(x -> new Integer[x]);