這是從維基百科:http://en.wikipedia.org/wiki/Arraylist下性能。 ArrayList:remove(),add()在數組末尾的時間,add(),remove()在開始的線性時間。java列表處理時間
LinkedList:兩種操作均表示:恆定時間,索引:線性。
1)爲什麼在兩個操作之間arraylist處理時間的區別?
2)Linkedlist對於索引是線性的,對於最後添加常量,爲什麼?
這是從維基百科:http://en.wikipedia.org/wiki/Arraylist下性能。 ArrayList:remove(),add()在數組末尾的時間,add(),remove()在開始的線性時間。java列表處理時間
LinkedList:兩種操作均表示:恆定時間,索引:線性。
1)爲什麼在兩個操作之間arraylist處理時間的區別?
2)Linkedlist對於索引是線性的,對於最後添加常量,爲什麼?
當你add
到ArrayList
的末尾時,它會自我增長以留出一些空間。所以如果你有一個十個元素ArrayList
,在最後添加將導致它在內部爲二十個元素分配空間,複製你已有的十個元素,然後添加一個元素。然後,當你在最後添加另一個元素時,它會將第十二個元素粘貼到它已經創建的空間中。
這在技術上並沒有給它在最後的固定時間插入,但它確實給它分期付款固定時間插入。也就是說,在大量的運營中,成本接近恆定的時間;每次增長時,它都會增加一倍,因此在必須再次進行增長和複製之前,您將擁有數量更多的「免費」常量插入。
當您在開始插入時,它不能這樣做,並且必須始終將整個列表複製到新位置(線性時間)。
因爲您只是將最後一個單元格從「已填充」切換到「可用空間」,所以從最後移除始終是恆定時間。你永遠不需要複製列表。
至於你的第二個問題,一個LinkedList
保持一個指針到列表的末尾,所以add
和remove
那裏只是使用該指針,因此是恆定的時間。在列表中間沒有快速指針,因此訪問任意元素需要從開始到(可能)結束的線性時間遍歷。
1)因爲要在開始時添加/刪除它必須移動所有內容並重新索引。
2)因爲它保持對頭部和尾部的引用(開始&結束)。索引意味着遍歷列表。
i)ArrayList - >在開始時刪除/添加的情況下,您必須將所有元素推到一個位置,因此需要線性時間。在數組的末尾,您只需添加或刪除。 ii)LinkedList - >你有頭部和尾部的引用,因此你可以在那裏添加/刪除任何東西(在不變的時間內)。