簡體   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