1.ArrayList实现RandomAccess接口有什么意义?

1.ArrayList实现RandomAccess接口有什么意义?

RandomAccess标识可以标识随机访问,也就是该集合底层是数组实现,遍历的时候用的应该是for循环,走数组下标访问元素,而不是迭代器

可能上面的表述有点歧义,这么说吧,RandomAccess标识,则说明该集合底层实现是数组,所以,你使用该集合的时候,最底层应该走的是for循环遍历数组下标来访问集合元素。


如果某集合没有RandomAccess标识,那么例如LinkedList,底层遍历走的就是迭代器,反过来想也很容易想明白,LinkedList基于链表来实现,所以遍历要一个元素一个元素的遍历。。。

ArrayList的get()方法:

LinkedList的get()方法:



从图中可以看出,ArrayList的get(i) 其实就是通过数组下标直接访问元素,O(1)级别

而LinkedList需要按找链表的一半大小遍历查找对应下标是哪个节点,然后去返回该位置的元素,效率为O(n)

测试用例如下:

package Collections11;import java.util.*;/** * @Description: * @Author: syn * @Date: 2020/06/15 **/public class RandomAccessTest {    public static void traverse(List list){        if (list instanceof RandomAccess){            System.out.println("实现了RandomAccess接口,不使用迭代器");            for (int i = 0;i < list.size();i++){                System.out.println(list.get(i));            }        }else{            System.out.println("没实现RandomAccess接口,使用迭代器");            Iterator it = list.iterator();            while(it.hasNext()){                System.out.println(it.next());            }        }    }    public static void main(String[] args) {        List<String> arrayList = new ArrayList();        arrayList.add("a");        arrayList.add("b");        traverse(arrayList);        List<String> linkedList = new LinkedList();        linkedList.add("c");        linkedList.add("d");        traverse(linkedList);    }} class RandomAccessTimeTest {    //使用for循环遍历    public static long traverseByLoop(List list){        long startTime = System.currentTimeMillis();        for (int i = 0;i < list.size();i++){            list.get(i);        }        long endTime = System.currentTimeMillis();        return endTime-startTime;    }    //使用迭代器遍历    public static long traverseByIterator(List list){        Iterator iterator = list.iterator();        long startTime = System.currentTimeMillis();        while (iterator.hasNext()){            iterator.next();        }        long endTime = System.currentTimeMillis();        return endTime-startTime;    }    public static void main(String[] args) {        //加入数据        List<String> arrayList = new ArrayList();        for (int i = 0;i < 30000;i++){            arrayList.add("" + i);        }        long loopTime = RandomAccessTimeTest.traverseByLoop(arrayList);        long iteratorTime = RandomAccessTimeTest.traverseByIterator(arrayList);        System.out.println("ArrayList:");        System.out.println("for循环遍历时间:" + loopTime);        System.out.println("迭代器遍历时间:" + iteratorTime);        List<String> linkedList = new LinkedList();        //加入数据        for (int i = 0;i < 30000;i++){            linkedList.add("" + i);        }        loopTime = RandomAccessTimeTest.traverseByLoop(linkedList);        iteratorTime = RandomAccessTimeTest.traverseByIterator(linkedList);        System.out.println("LinkedList:");        System.out.println("for循环遍历时间:" + loopTime);        System.out.println("迭代器遍历时间:" + iteratorTime);    }}

总结一下,使用ArrayList()遍历使用for循环还是迭代器都可以,效率基本一致,但是如果要时使用LinkedList,确使用的for循环通过下标遍历,肯定性能低下,而应该使用迭代器。

推荐阅读

    上下标快捷键|上下标快捷键怎么打

    上下标快捷键|上下标快捷键怎么打,,上下标快捷键怎么打上标快捷键:首先,选中需要加上标的字符,然后使用Word快捷键“ Ctrl + Shift + (加号)+

    下标快捷键ps|下标快捷键快

    下标快捷键ps|下标快捷键快,,下标快捷键快word下标快捷键怎么用方法/步骤:1.双击打开需要使用快捷键输入下标的word文档。2.选定需要下标

    数列求和快捷键|数组求和快捷键

    数列求和快捷键|数组求和快捷键,,数组求和快捷键1,这是文本型数组直接运算 不可能 除非单个的取出来分割后转数值型,再找相同的X[1],进行X[2

    电脑系统标志|电脑标识大全

    电脑系统标志|电脑标识大全,,电脑标识大全转 1、机器外壳上有音乐符号的是惠普旗下的康柏品牌电脑。 2、康柏电脑,是由三位来自德州仪器公

    ai数字下标快捷键|AI文字快捷键

    ai数字下标快捷键|AI文字快捷键,,1. AI文字快捷键ai中把文字全选的方法是:1.电脑打开AI软件。2.要一次性选择所有文字,点击菜单栏中的选择

    下标快捷键技巧|下标快捷键快

    下标快捷键技巧|下标快捷键快,,下标快捷键快win7系统中打数字的上下标方法:一、 使用快捷键。在Word中使用快捷键进行输入,既方便又快捷。1.

    快捷键元符号|符号下标快捷键

    快捷键元符号|符号下标快捷键,,1. 符号下标快捷键一、首先打开Excel表格,鼠标左键拖动选中要更改的文字。二、这时按住Alt键不放,依次输入OE

    ppt中下标快捷键|ppt下标的快捷键

    ppt中下标快捷键|ppt下标的快捷键,,1. ppt下标的快捷键end 键是结束,取消的意思PPT 常用快捷键如下Ctrl + M - 插入一张新的幻灯片Ctrl + D