为什么(List <Object>)list.size()的运行时间复杂度为O(1)?

时间:2019-07-15 17:44:28

标签: java time-complexity

根据here,我了解到某些静态arr的复杂度为O(1)

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

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)

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:4)

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

答案 2 :(得分:3)

您要特别问为什么List.of(1, 2, 3, 4, 5).size() O(1)

尽管其他答案正确地说明了诸如ArrayListLinkedList之类的实现将列表大小显式存储为列表的字段,但实际上并不能回答您的问题,因为{{3} }不使用这些实现。

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

尽管实现方式确实有所不同,但构建了一个不可变的列表,E[]变成了与List.of​(E... elements)相似的列表,即通过将数组包装在List实现中直接使用数组。

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