Java基礎系列-RandomAccess

唯一浩哥發表於2020-10-10

原創文章,轉載請標註出處:https://www.cnblogs.com/V1haoge/p/10755424.html
Random是隨機的意思,Access是訪問的意思,合起來就是隨機訪問的意思。

RandomAccess介面是一個標記介面,用以標記實現的List集合具備快速隨機訪問的能力。

那麼什麼是隨機訪問的能力呢?其實很簡單,隨機訪問就是隨機的訪問List中的任何一個元素。

所有的List實現都支援隨機訪問的,只是基於基本結構的不同,實現的速度不同罷了,這裡的快速隨機訪問,那麼就不是所有List集合都支援了。

  • ArrayList基於陣列實現,天然帶下標,可以實現常量級的隨機訪問,複雜度為O(1)
  • LinkedList基於連結串列實現,隨機訪問需要依靠遍歷實現,複雜度為O(n)

二者的差距顯而易見,所以ArrayList具備快速隨機訪問功能,而LinkedList沒有。我們也能看到:

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{/*...*/}
public class LinkedList<E>
    extends AbstractSequentialList<E>
    implements List<E>, Deque<E>, Cloneable, java.io.Serializable
{/*...*/}

ArrayList實現了RandomAccess介面,而LinkedList沒有。

那麼到底這個介面有什麼用呢?

當一個List擁有快速訪問功能時,其遍歷方法採用for迴圈最快速。而沒有快速訪問功能的List,遍歷的時候採用Iterator迭代器最快速。

當我們不明確獲取到的是Arraylist,還是LinkedList的時候,我們可以通過RandomAccess來判斷其是否支援快速隨機訪問,若支援則採用for迴圈遍歷,否則採用迭代器遍歷,如下方式:

public class RandomAccessTest {
    private List<String> list = null;
    public RandomAccessTest(List<String> list){
        this.list = list;
    }
    public void loop(){
        if(list instanceof RandomAccess) {
            // for迴圈
            System.out.println("採用for迴圈遍歷");
            for (int i = 0;i< list.size();i++) {
                System.out.println(list.get(i));
            }
        } else {
            // 迭代器
            System.out.println("採用迭代器遍歷");
            Iterator it = list.iterator();
            while(it.hasNext()){
                System.out.println(it.next());
            }
        }
    }
    public static void main(String[] args) {
        List<String> list = Arrays.asList("123","456","789","1110");
        List<String> list1 = new LinkedList<>();
        list1.add("aaa");
        list1.add("bbb");
        list1.add("ccc");
        new RandomAccessTest(list).loop();
        new RandomAccessTest(list1).loop();
    }
}

執行結果:

採用for迴圈遍歷
123
456
789
1110
採用迭代器遍歷
aaa
bbb
ccc

那麼都有哪些類實現了這個介面呢?

  • ArrayList
  • Vector
  • CopyOnWriteArrayList
  • RandomAccessSubList
  • UnmodifiableArrayList

相關文章