Java基础系列-RandomAccess
原创文章,转载请标注出处: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
Java基础系列-RandomAccess的更多相关文章
- Java基础系列-ArrayList
原创文章,转载请标注出处:<Java基础系列-ArrayList> 一.概述 ArrayList底层使用的是数组.是List的可变数组实现,这里的可变是针对List而言,而不是底层数组. ...
- 2015年12月28日 Java基础系列(六)流
2015年12月28日 Java基础系列(六)流2015年12月28日 Java基础系列(六)流2015年12月28日 Java基础系列(六)流
- Java基础系列--static关键字
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/8477914.html 一.概述 static关键字是Java诸多关键字中较常使用的一个,从 ...
- Java基础系列-Collector和Collectors
原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/10748925.html 一.概述 Collector是专门用来作为Stream的coll ...
- Java基础系列-二进制操作
原创文章,转载请标注出处:<Java基础系列-二进制操作> 概述 Java源码中涉及到大量的二进制操作,非常的复杂,但非常的快速. Java二进制表示法 首先了解下二进制,二进制是相对十进 ...
- Java基础系列-equals方法和hashCode方法
原创文章,转载请标注出处:<Java基础系列-equals方法和hashCode方法> 概述 equals方法和hashCode方法都是有Object类定义的. publi ...
- Java基础系列-Comparable和Comparator
原创文章,转载请标注出处:<Java基础系列-Comparable和Comparator> 一.概述 Java中的排序是由Comparable和Comparator这两个接 ...
- Java基础系列--HashMap(JDK1.8)
原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/10022092.html Java基础系列-HashMap 1.8 概述 HashMap是 ...
- 夯实Java基础系列1:Java面向对象三大特性(基础篇)
本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 [https://github.com/h2pl/Java-Tutorial](https: ...
随机推荐
- Auto Generate Reflection Information for C++
https://www.reddit.com/r/gamedev/comments/3lh0ba/using_clang_to_generate_c_reflection_data/ https:// ...
- Fragment 1.2.0 更新记录
1.官方地址 https://developer.android.com/jetpack/androidx/releases/fragment 2.引入方法 dependencies { def fr ...
- python中os.path下模块总结
import os path =os.path.abspath("abc.text") # 返回绝对路径 print("path:",path) # path: ...
- Flutter Toast消息提示框插件
Flutter Toast消息提示框插件 在开发flutter项目中,想必大家肯定会用到toast消息提示,说到这里, 大家肯定会想到https://pub.dev/ 插件库, 但是插件市场上有太多类 ...
- springBoot整合spring security+JWT实现单点登录与权限管理--筑基中期
写在前面 在前一篇文章当中,我们介绍了springBoot整合spring security单体应用版,在这篇文章当中,我将介绍springBoot整合spring secury+JWT实现单点登录与 ...
- 解决winserver2012R2安装VMware15(pro)问题
问题:之前就遇到过,一台WIN2012R2装不了vmwareworkstation15的问题.这次又安装了一台WindowsServer2012R2Datacenter:依然发现安装不了,于是开始上网 ...
- Activiti7 流程部署
首先先绘制一个流程图 创建bpmn文件 然后绘制好节点 然后修改节点信息 指定负责人 点击背景,修改ID和名称 保存 然后重命名成xml 使用diagram打开 导出png 然后包xml改回bpmn ...
- python图片转码为base64
import base64 def image_base64(): with open(image_path, 'rb', )as f: base64_data = base64.b64encode( ...
- 真正的解决IDEA中Tomcat控制台乱码的问题
真正的解决IDEA中Tomcat控制台乱码的问题 解决方案一 网上看到一个真正的解决方案: 首先要分清是tomcat日志编码,与idea的日志显示控制台编码 tomcat日志编码:当在cmd中启动To ...
- [SqlServer]数据库备份-问题及解决
正常数据库备份 备份:右键要备份的数据库-任务-备份 还原:右键数据库-还原数据库 问题1-"还原数据库备份时报错"介质集有2个介质簇,但只提供了1个.必须提供所有成员" ...