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.
随机访问的性能都是高于顺序访问。

原创粉丝点击