Java集合系列-RandomAccess
原创文章,转载请标注出处:《Java集合系列-RandomAccess》
【Java集合系列-RandomAccess】Random是随机的意思,Access是访问的意思,合起来就是随机访问的意思。
RandomAccess接口是一个标记接口,用以标记实现的List集合具备快速随机访问的能力。
那么什么是随机访问的能力呢?其实很简单,随机访问就是随机的访问List中的任何一个元素。
所有的List实现都支持随机访问的,只是基于基本结构的不同,实现的速度不同罢了,这里的快速随机访问,那么就不是所有List集合都支持了。
- ArrayList基于数组实现,天然带下标,可以实现常量级的随机访问,复杂度为O(1)
- LinkedList基于链表实现,随机访问需要依靠遍历实现,复杂度为O(n)
public class ArrayList extends AbstractList
implements List, RandomAccess, Cloneable, java.io.Serializable
{/*...*/}
public class LinkedList
extends AbstractSequentialList
implements List, Deque, Cloneable, java.io.Serializable
{/*...*/}
ArrayList实现了RandomAccess接口,而LinkedList没有。
那么到底这个接口有什么用呢?
当一个List拥有快速访问功能时,其遍历方法采用for循环最快速。而没有快速访问功能的List,遍历的时候采用Iterator迭代器最快速。
当我们不明确获取到的是Arraylist,还是LinkedList的时候,我们可以通过RandomAccess来判断其是否支持快速随机访问,若支持则采用for循环遍历,否则采用迭代器遍历,如下方式:
public class RandomAccessTest {
private List list = null;
public RandomAccessTest(List 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 list = Arrays.asList("123","456","789","1110");
List 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
推荐阅读
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 图书集合完毕
- 事件代理
- 【欢喜是你·三宅系列①】⑶
- Java|Java OpenCV图像处理之SIFT角点检测详解
- java中如何实现重建二叉树
- 数组常用方法一
- 你不可不知的真相系列之科学
- 【Hadoop踩雷】Mac下安装Hadoop3以及Java版本问题
- 人脸识别|【人脸识别系列】| 实现自动化妆