java集合类之随机访问和顺序访问
来源:互联网 发布:微商比淘宝便宜 编辑:程序博客网 时间:2024/05/16 14:54
概述
java集合类中元素的访问分为随机访问和顺序访问。随机访问一般是通过index下标访问,行为类似数组的访问。而顺序访问类似于链表的访问,通常为迭代器遍历。
以List接口及其实例为例。ArrayList是典型的随机访问型,而LinkedList则是顺序访问型。List接口既定义了下标访问方法又定义了迭代器方法。所以其实例既可使用下标随机访问也可以使用迭代器进行遍历。但这两种方式的性能差异很明显。
RandomAccess接口
JDK中的RandomAccess接口是一个标记接口,它并未定义方法。其目的是用于指示实现类具有随机访问特性,在遍历时使用下标访问较迭代器更快。如果:
for(int i = 0, n = list.size(); i < n; i++) list.get(i);
的运行比
for(Interator i = list.iterator();i.hasNext();) i.next();
快,则应实现RandomAccess接口。
ArrayList和LinkedList随机访问的区别
ArrayList是数组结构,随机访问具有常量时间。
LinkedList是链表结构,随机访问分为两步:
- 首先根据index查找Node,通常是一个for循环查找index对应的Node
- 然后返回Node中存储的元素
ArrayList的下标遍历性能远高于LinkedList的下标遍历。
测试示例
public class AccessModel { private long start; private long stop; public AccessModel() { } private void prepare(List<Integer> list, int cnt) { for (int i = 0; i < cnt; i++) { list.add(i); } } public void doTest() { ArrayList<Integer> array = new ArrayList<>(); LinkedList<Integer> link = new LinkedList<>(); prepare(array, 10000); prepare(link, 10000); randomAccess(array); randomAccess(link); sequentialAccess(array); sequentialAccess(link); } private void randomAccess(List<Integer> l) { start = System.currentTimeMillis(); for (int count = 0; count <= 1000; count++) { for (int i = 0; i < l.size(); i++) { l.get(i); } } stop = System.currentTimeMillis(); System.out.println("random access used:" + (stop - start) + "ms."); } private void sequentialAccess(List<Integer> l) { start = System.currentTimeMillis(); for (int count = 0; count <= 1000; count++) { for (Iterator<Integer> it = l.iterator(); it.hasNext();) { it.next(); } } stop = System.currentTimeMillis(); System.out.println("sequential access used:" + (stop - start) + "ms."); }}
prepare 10000次的结果如下:
random access used:8ms.
random access used:40057ms.
sequential access used:14ms.
sequential access used:49ms.
prepare 1000次的结果如下:
random access used:8ms.
random access used:340ms.
sequential access used:10ms.
sequential access used:11ms.
随机访问的性能都是高于顺序访问。
- java集合类之随机访问和顺序访问
- java集合类之随机访问和顺序访问
- 顺序访问和随机访问
- Java RandomAccessFile随机访问类
- Java之RandomAccessFile(随机访问文件)
- java 随机访问 RandomAccessFile
- java随机访问文件
- 顺序容器之访问和大小操作
- Java 文件随机访问类-RandomAccessFile
- C++ 顺序容器的安全随机访问
- 随机访问类(RandomAccessFile)
- 随机访问类(RandomAccessFile) -
- java优化集合访问
- STL 之随机访问迭代器
- STL 之随机访问迭代器
- java: 随机访问流RandomAccessFile
- 【java】数组、arraylist、linkedlist随机访问和遍历性能比较
- Java文件操作-随机访问文件和zip文档
- Android 源码目录结构分析简介
- iframe与主框架跨域相互访问方法
- oracle中CAST函数使用简介【转】
- java基础—接口与抽象类的区别
- DataNode启动异常"java.io.IOException: Cannot lock storage /i/dfs/dn. The directory is already lock"
- java集合类之随机访问和顺序访问
- java中重载与重写的区别
- 什么是事件委托
- 复杂网络分析库NetworkX学习笔记(1):入门
- HTTP状态码
- Hive语句前的常见设置
- vue嵌套路由配置
- megan的javaScript学习笔记二---number methods
- SXSSFWorkbook 导出大批量数据和图片到excel