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

java 专栏收录该内容
5 篇文章 0 订阅

概述

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

  • 1
    点赞
  • 0
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值