簡體   English   中英

List如何在Java中具有快速隨機訪問?

[英]How does the List has fast random access in Java?

RandomAccess接口標識特定的java.util.List實現具有快速隨機訪問。 該接口試圖定義一個不精確的概念:快速有多快? 該文檔提供了一個簡單的指南:

if repeated access using the List.get() method is faster than repeated access
using the Iterator.next() method, then the List has fast random access. 

以下代碼示例顯示了兩種訪問方式:

Object o;
for (int i=0, n=list.size(); i < n; i++)
o = list.get(i);

Object o;
for (Iterator itr=list.iterator(); itr.hasNext(); )
o = itr.next();

當List.get()方法比使用Iterator.next()方法進行重復訪問快時,List如何實現快速隨機訪問。

“快速”意味着不精確的性質是我們擁有算法復雜性(又稱為“大O”符號)概念的原因。 隨機訪問意味着get運算的算法復雜度為O(1),對於ArrayList是這樣。 相反,對LinkedList的get操作的算法復雜度為O(n)。

當List.get()方法比使用Iterator.next()方法進行重復訪問快時,List如何實現快速隨機訪問。

僅建議使用list.get()的速度快於iterator.next()的情況將其標記為使用RandomAccess進行快速隨機訪問。 編程特定List實現的程序員仍然必須選擇使其List實現RandomAccess。

可以理解,因為list.get(i)將直接查詢數據,所以這樣的方法調用會比iterator.next()更快(對於具有良好隨機訪問的List而言),因為下一個方法可能會增加其他方法的開銷方法調用和其他邏輯。 如果迭代器速度更快,則可能比您可以安全地打賭,這是因為List沒有良好的隨機訪問,並且迭代器速度更快,因為它使用了一種從節點到節點的優化方法(例如List的迭代器實現可能具有一定的訪問權限)到通常是其他類專用的基礎List數據)。

該示例代碼確實有點誤導,因為與基於迭代器的解決方案的比較有損於實際情況:

List#get(int)方法具有恆定的漸近運行時間時,列表應實現RandomAccess接口! (用大O表示法寫為O(1))。

考慮一個ArrayList :內部存儲在數組中的數據。 調用arrayList.get(1)將花費與調用arrayList.get(100000)相同的時間。

與此相反:一個LinkedList 提供RandomAccess 雖然你仍然可以調用linkedList.get(1)linkedList.get(100000)后者將需要更長的時間,因為它直到它到達第十萬元素遍歷整個列表。

有一種方法可以在鏈表上實現O(log n)(最壞的情況)隨機訪問。 該方法與跳過列表,岡崎的列表和Haskell的樹沒有任何關系。 它已經在這里提出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM