簡體   English   中英

什么是RandomAccess? 為什么我們使用RandomAccess?

[英]What basically is RandomAccess? Why we use RandomAccess?

我當時在研究Java中的集合,但我發現一個問題是,諸如ArrayList之類的某些類也實現RandomAccess,而某些類則沒有。 我想知道為什么要實現此接口及其好處? 如果我在課堂上使用此接口會怎樣?

隨機訪問列表與順序列表

隨機訪問列表是一個列表,您可以在其中以恆定的速度更快地訪問任何隨機數據,而順序列表是必須依次遍歷其之前的所有項目以訪問任何特定項目的列表。

如下面的圖形圖像所示,您可以看到在第一個示例中,如果要訪問9,則可以直接使用index獲取值,而在第二個圖像中,數據不能被隨機訪問,需要遍歷23 -> 3 -> 17 -> 942 -> 9 ,因此第二種情況下訪問任何值的時間不是恆定的,並且每個值都不同。

在此處輸入圖片說明

為什么要實現RandomAccess接口?

作為JDK 1.4的一部分引入的,它是一個標記器接口,它指示實現它的類在訪問列表中的任何隨機數據時花費恆定且快速的時間。

有什么好處?

該算法的任何實現都可以檢查當前列表是否為“隨機訪問”的子級,從而確保隨機訪問或順序訪問的最佳性能。

以下是一個博客中的一個很好的示例,該示例很好地解釋了一種用法:

Object o;
if (listObject instanceof RandomAccess)
{
  for (int i=0, n=list.size(); i < n; i++)
  {
    o = list.get(i); // directly get the object as list implements Random access
    //do something with object o
  }

}
else
{
  Iterator itr = list.iterator();
  for (int i=0, n=list.size(); i < n; i++)
  {
    o = itr.next(); // Use iterator to get values sequentially as random access 
                    //  is not fast for this list and hence does not implement RandomAccess
    //do something with object o

  }
}

如果我在課堂上使用此接口會怎樣?

當您實現任何其他標記接口時,也會發生同樣的情況。 它只是給其他類一個指示,因為實現它的類可以期望什么。

您也可以參考Java文檔以了解更多信息。

RandomAccess標記接口 它沒有任何方法。 它的標記ArrayList表示它支持對給定索引O(1)的任何值進行隨機訪問。

另一方面, LinkedList 提供對其元素的O(1)隨機訪問,因為它由雙鏈表支持(因此O(n)隨機訪問復雜度)。 因此,將RandomAccess用於LinkedList沒有意義。 可以對沒有實現 RandomAccess其他Collection類給出相同的推理。

我想知道為什么要實現此接口及其好處?

Java收集框架使用此接口來優化性能

直接出文檔:

根據經驗,對於類的典型實例,如果存在以下循環,則List實現應實現此接口:

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

比這個循環運行更快:

  for (Iterator i=list.iterator(); i.hasNext(); ) i.next(); 

另請參閱此處的Javadoc,它對此進行了精美的解釋。

暫無
暫無

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

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