原創(chuàng)文章墩朦,轉載請標注出處:《Java集合系列-RandomAccess》
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循環(huán)最快速闯团。而沒有快速訪問功能的List辛臊,遍歷的時候采用Iterator迭代器最快速。
當我們不明確獲取到的是Arraylist房交,還是LinkedList的時候彻舰,我們可以通過RandomAccess來判斷其是否支持快速隨機訪問,若支持則采用for循環(huán)遍歷候味,否則采用迭代器遍歷刃唤,如下方式:
public class RandomAccessTest {
private List<String> list = null;
public RandomAccessTest(List<String> list){
this.list = list;
}
public void loop(){
if(list instanceof RandomAccess) {
// for循環(huán)
System.out.println("采用for循環(huán)遍歷");
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();
}
}
執(zhí)行結果:
采用for循環(huán)遍歷
123
456
789
1110
采用迭代器遍歷
aaa
bbb
ccc
那么都有哪些類實現了這個接口呢?
- ArrayList
- Vector
- CopyOnWriteArrayList
- RandomAccessSubList
- UnmodifiableArrayList