java集合类之随机访问和顺序访问

概述

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

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值