Java中RandomAccess接口简介

在阅读ArrayList的源码时,你会发现这样一个接口:RandomAccess。接下来让我们探索一下这个接口。

首先,这是一个标识性接口,不包含实际方法。官方API中的介绍如下:

Marker interface used by List implementations to indicate that
they support fast (generally constant time) random access. The primary
purpose of this interface is to allow generic algorithms to alter their
behavior to provide good performance when applied to either random or
sequential access lists.

也就是说,这个接口在List具体实现中的主要作用是用来指出该实现支持快速随机访问,从而,可以使得某些通用算法可以根据某些实现是否支持快速随机访问来修改算法行为以提高性能。

官方API中还特别指出,实现了该接口的List的具体实现,使用for循环迭代的速度要远远高于Iterator循环。

As a rule of thumb, aList implementation should implement this interface if, for typical instances of the class, this loop:
​ for (int i=0, n=list.size(); i < n; i++)
list.get(i);
​ for (Iterator i=list.iterator(); i.hasNext(); )
i.next();

我们对ArrayList的for遍历和Iteraotr的遍历做一个简单测试,我们使用数据量为1000000的ArrayList,并遍历10000次,并计算耗时。从计算结果看,当数据量越大时,for遍历的时间优势越高。因此,我们在处理大数据并要求高性能时,这也是值得注意的一个点。

    public static long arrayFor() {
        List<Integer> list = new ArrayList<>();
        for (int i = 1; i <= 1000000; i++) {
            list.add(i);
        }
        
        long startTime = System.currentTimeMillis();

        for (int i = 0; i < 10000; i++) {
            for (int j = 0; j < list.size(); j++) {
                Object num = list.get(j);
            }
        }

        long endTime = System.currentTimeMillis();
        
        return endTime - startTime;
    }

    public static long arrayIterator() {
        List<Integer> list = new ArrayList<>();
        for (int i = 1; i <= 1000000; i++) {
            list.add(i);
        }
        
        long startTime = System.currentTimeMillis();

        for (int i = 0; i < 10000; i++) {
            Iterator iterator = list.iterator();
            while (iterator.hasNext()) {
                Object next = iterator.next();
            }
        }

        long endTime = System.currentTimeMillis();

        return endTime - startTime;
    }
    public static void main(String[] args) {
        long time1 = arrayFor();
        long time2 = arrayIterator();

        System.out.println("ArrayList for循环所用时间 = " + time1 + " ms");
        System.out.println("ArrayList 迭代器所用时间 = " + time2 + " ms");
    }

结果输出:

ArrayList for循环所用时间 = 8 ms
ArrayList 迭代器所用时间 = 474 ms

Process finished with exit code 0

每日学习笔记,写于2020-06-02 星期二

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。