繁体   English   中英

为什么运行时间复杂(清单 <Object> )list.size()是O(1)吗?

[英]Why the running time complexity of (List<Object>) list.size() is O(1)?

这里我知道一些静态arr的复杂度为O(1)

但是对于动态数组,永远不会设置大小,那么复杂度将如何保持不变? 甚至Oracle 文档也是如此。

static int count =  0;
public static void main(String[] args) {
    List.of(1, 2, 3, 4, 5).forEach(x -> count++); // Java-10
    System.out.println(count);
}

此代码应确定列表的大小,如果运行了O(n)次,那么为什么

List.of(1, 2, 3, 4, 5).size();

是O(1)

例如, 在这里 ,ArrayList将存储当前大小以使其立即可用。 其他列表将是相似的,因为这是常见的优化。 (例如LinkedList

在形成列表时,时间复杂度不是O(1) 列表形成后,尺寸将内部保存在列表中。 之后,当我们调用List.size()它只返回保存的大小,时间复杂度为O(1)

您是在问为什么List.of(1, 2, 3, 4, 5).size()O(1)

虽然其他答案正确地指出诸如ArrayListLinkedList实现将列表大小显式存储为列表的字段,但实际上并不能回答您的问题,因为List.of​(E... elements)不使用这些实现。

List.of(E... elements)List.of(E... elements) ,这意味着在内部它实际上是List.of(E[] elements) ,并且编译器为您构建了一个固定数组。 在您的情况下,该数组的大小恰好为5。

虽然实现真正的不同,建设一个不可变列表中, E[]变成一个列表类似于如何Arrays.asList​(T... a)这样做,即通过包装阵列中的List实现,它使用的直接数组。

这样,列表的大小是众所周知的,因为列表的大小就是支持数组的长度

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM