原創文章,轉載請標註出處: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