根据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)
答案 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)。
尽管其他答案正确地说明了诸如ArrayList
和LinkedList
之类的实现将列表大小显式存储为列表的字段,但实际上并不能回答您的问题,因为{{3} }不使用这些实现。
List.of(E... elements)
是varargs,这意味着在内部它实际上是List.of(E[] elements)
,并且编译器会为您构建一个固定的数组。就您而言,该数组的大小恰好为5。
尽管实现方式确实有所不同,但构建了一个不可变的列表,E[]
变成了与List.of(E... elements)
相似的列表,即通过将数组包装在List
实现中直接使用数组。
这样,列表的大小是众所周知的,因为大小是支持数组的长度。