java集合类之随机访问和顺序访问
2017-10-09 10:56
543 查看
概述
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.
随机访问的性能都是高于顺序访问。
相关文章推荐
- C++ 顺序容器的安全随机访问
- Java集合类:"随机访问" 的RandomAccess接口
- 顺序访问和随机访问
- 随机访问和顺序访问
- HAL的存放路路径和命名规则 及android .prop的访问顺序
- 从list中随机选出几个数,并按照原来的顺序排列
- STL 容器和迭代器连载8_访问顺序容器的元素
- 005_006 Python 随机访问列表的元素
- Java中对List集合内的元素进行顺序、倒序、随机排序的示例代码
- 在一个包含40亿个随机排列的32位整数的顺序文件中(注意随机排序),找出一个不再文件中的32位整数
- 点了dataGrid一列头后,记录产生了排序,顺序变后,新的记录怎么访问?
- MappedByteBuffer高速缓存文件、RandomAccessFile随机访问
- C程序设计语言- UNIX系统接口-7.1----文件描述符、低级IO(read、write)、随机访问、(open、creat、close、unlink)
- java 访问后台方法顺序混乱
- 【分布式系统工程实践】随机访问KV存储引擎
- iframe加载顺序导致数据访问出现问题
- 备注内存访问顺序的文章
- 从数据库层面理解:随机 I/O & 顺序 I/O
- 用java.lang.Math.random()语句,随机输出{size:自定义参数}个数不重复并且按顺序从小到大排列(冒泡排序)
- STL里的list是双链表 有双向迭代器,不能随机访问