RandomAccess 接口使用

java.util.RandomAccess

用法

Random Access List(隨機訪問列表)如 ArrayList 要實現(xiàn)此接口,Sequence Access List(順序訪問列表)如 LinkedList 不要實現(xiàn)。
因為兩者的高效遍歷算法不同

通常做法,遍歷前先判斷:

if (list instance of RandomAccess) {        
  for(int m = 0; m < list.size(); m++){}    
}else{       
  Iterator iter = list.iterator();       
  while(iter.hasNext()){}   
}

隨機訪問列表使用循環(huán)遍歷,順序訪問列表使用迭代器遍歷。

JDK 定義

List 實現(xiàn)使用的標記接口,用來表明支持快速(通常是固定時間)隨機訪問。這個接口的主要目的是允許一般的算法更改它們的行為,從而在隨機或連續(xù)訪問列表時提供更好的性能。

將操作隨機訪問列表(比如 ArrayList)的最好的算法應(yīng)用到順序訪問列表(比如 LinkedList)時,會產(chǎn)生二次項行為。鼓勵一般的列表算法檢查給定的列表是否 instanceof 這個接口,防止在順序訪問列表時使用較差的算法,如果需要保證可接受的性能時可以更改算法。

公認的是隨機和順序訪問的區(qū)別通常是模糊的。例如,當一些 List 實現(xiàn)很大時會提供漸進的線性訪問時間,但實際是固定的訪問時間。這樣的 List 實現(xiàn)通常應(yīng)該實現(xiàn)此接口。通常來說,一個 List 的實現(xiàn)類應(yīng)該實現(xiàn)這個接口如果

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

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

驗證事例

package com.ld.practice.arraylist;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.RandomAccess;

/**
 * 測試Random Access List(隨機訪問列表)如 ArrayList 和 Sequence Access List(順序訪問列表)如 LinkedList </br>
 * 不同遍歷算法的效率</br>
 * 結(jié)論:前者用循環(huán),后者用迭代器
 */
@SuppressWarnings({"rawtypes", "unchecked"})
public class ListLoopTest {
    
    /**
     * 初始化 list,添加n個元素
     * 
     * @param list
     * @return
     */
    public static <T> List initList(List list, int n) {
        for (int i = 0; i < n; i++)
            list.add(i);
        return list;
    }
    
    /**
     * 遍歷 list,判斷是否實現(xiàn) RandomAccess 接口來使用不同的遍歷方法
     * 
     * @param list
     */
    public static void accessList(List list) {
        long startTime = System.currentTimeMillis();
        
        if (list instanceof RandomAccess) {
            System.out.println("實現(xiàn)了 RandomAccess 接口...");
            for (int i = 0; i < list.size(); i++) {
                list.get(i);
            }
        } else {
            System.out.println("沒實現(xiàn) RandomAccess 接口...");
            for (Iterator iterator = list.iterator(); iterator.hasNext();) {
                iterator.next();
            }
        }
        
        long endTime = System.currentTimeMillis();
        System.out.println("遍歷時間:" + (endTime - startTime));
    }
    
    /**
     * loop 遍歷 list
     */
    public static void accessListByLoop(List list) {
        long startTime = System.currentTimeMillis();
        
        for (int i = 0; i < list.size(); i++) {
            list.get(i);
        }
        
        long endTime = System.currentTimeMillis();
        System.out.println("loop遍歷時間:" + (endTime - startTime));
    }
    
    /**
     * 迭代器遍歷
     */
    public static void accessListByIterator(List list) {
        long startTime = System.currentTimeMillis();
        
        for (Iterator iterator = list.iterator(); iterator.hasNext();) {
            iterator.next();
        }
        
        long endTime = System.currentTimeMillis();
        System.out.println("Iterator遍歷時間:" + (endTime - startTime));
    }
    
    public static void main(String[] args) {
        ArrayList<Integer> aList = (ArrayList<Integer>) initList(new ArrayList<>(), 2000000);
        LinkedList<Integer> lList = (LinkedList<Integer>) initList(new LinkedList<>(), 50000);
        
        accessList(aList);
        accessList(lList);
        
        System.out.println("ArrayList");
        accessListByLoop(aList);
        accessListByIterator(aList);
        
        System.out.println("LinkedList");
        accessListByLoop(lList);
        accessListByIterator(lList);
    }

}
實現(xiàn)了 RandomAccess 接口...
遍歷時間:8
沒實現(xiàn) RandomAccess 接口...
遍歷時間:2
ArrayList
loop遍歷時間:5
Iterator遍歷時間:8
LinkedList
loop遍歷時間:1532
Iterator遍歷時間:1

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 集合類框架的介紹: ![Java 集合類框架](https://upload-images.jianshu.io/...
    LynnGuo閱讀 799評論 0 1
  • 在編程中,常常需要集中存放多個數(shù)據(jù)。集合類主要負責保存、盛裝其他數(shù)據(jù),因此集合類也被稱為容器類。所有的集合類都位于...
    一一一二二三閱讀 483評論 0 1
  • ? 在編寫java程序中,我們最常用的除了八種基本數(shù)據(jù)類型,String對象外還有一個集合類,在我們的的程序中到處...
    Java幫幫閱讀 1,544評論 0 6
  • 第十一章 持有對象 Java實用類庫還提供了一套相當完整的容器類來解決這個問題,其中基本的類型是List、Set、...
    Lisy_閱讀 908評論 0 1
  • java筆記第一天 == 和 equals ==比較的比較的是兩個變量的值是否相等,對于引用型變量表示的是兩個變量...
    jmychou閱讀 1,644評論 0 3

友情鏈接更多精彩內(nèi)容