ArrayList 为啥要实现 RandomAccess 接口?

简介: 在我们的开发中,List接口是最常见不过,而且我们几乎每天都在用ArrayList或者LinkedList,但是细心的同学有没有发现,ArrayList中实现了RandomAccess接口,而LinkedList却没有实现

在我们的开发中,List接口是最常见不过,而且我们几乎每天都在用ArrayList或者LinkedList,但是细心的同学有没有发现,ArrayList中实现了RandomAccess接口,而LinkedList却没有实现


RandomAccess接口,这是为什么呢?

image.png



RandomAccess接口中是空的,RandomAccess接口又是什么呢?


image.png


RandomAccess接口

RandomAccess是一个标记接口,官方解释是只要List实现这个接口,就能支持快速随机访问。而什么是随机访问呢?


接下来我们来举例说明。


Collections是集合的一个工具类,我们看一下Collections源码中的二分搜索方法。


image.png


在源码中可以看出,判断list是否是RandomAccess的实例,如果是,则执行indexedBinarySearch方法,如果不是,则执行iteratorBinarySearch方法。接下来看一下这两个方法。


image.png

image.png





上述两个方法的源码表示,实现了RandomAccess接口的List使用索引遍历,而未实现RandomAccess接口的List使用迭代器遍历。


那么为什么要这么设计呢?


既然涉及到二分搜索的遍历操作,那么现在我们来分析一下ArrayList和LinkedList遍历元素的性能如何?



image.pngimage.pngimage.png







测试结果如下测试ArrayList通过for遍历所消耗时间:1


测试ArrayList通过iterator遍历所消耗时间:2


测试LinkedList通过for遍历所消耗时间:47


测试LinkedList通过iterator遍历所消耗时间:1


我们来分析一下测试结果:ArrayList通过for遍历比通过iterator遍历要稍快,LinkedList通过iterator遍历比通过for遍历要快。


所以说在我们的应用中,要考虑使用List接口的哪种实现类,可以更好更高效的满足实际场景需求。所以在这里通过实现RandomAccess接口来区分List的哪种实现类。


总结

最后总结一句话:实现RandomAccess接口的List可以通过for循环来遍历数据比使用iterator遍历数据更高效,未实现RandomAccess接口的List可以通过iterator遍历数据比使用for循环来遍历数据更高效。


相关文章
|
2天前
|
存储 安全 Java
Java集合篇之深入解析ArrayList,这六问你答的上来吗?
Java集合篇之深入解析ArrayList,这六问你答的上来吗?
15 1
|
7月前
|
存储 Java 索引
java集合框架List子接口之LinkedList源码剖析
LinkendList从物理结构来说是一种线性结构 , 而从逻辑结构来说是一种链式存储结构 , 虽然是线性结构 , 但是并不会按照线性的顺序存储 , 而是分散存储在内存中 , 通过指针来建立节点与节点之间的联系, 同时实现了Deque这也说明它是一个双向链表 , 在源码中 , 没有看到它对线程安全问题的处理 , 所以它同时还是一个线程不安全的链表 , 也没有看到不允许插入null元素 , 重复元素的处理 , 所以它又是一个允许重复元素以及null元素的链表
36 0
|
7月前
|
XML 存储 JSON
java框架集合List子接口之ArrayList源码剖析
ArrayList使用尾删法时 , 时间复杂度为O(1) , 并且会把最后一个元素置位null , 其它删除时间复杂度为O(N) , 因为会涉及到元素的移动以及元素的遍历 ArrsyList是线程不安全的
26 0
|
9月前
|
存储 Java API
ArrayList类【JDK源码分析】
ArrayList类【JDK源码分析】
33 0
|
Java
Java集合Collection接口中的常用方法演示
由于接口不可以创建对象,所以,以下方法的演示将以Collection接口的子接口List的实现类ArrayList()进行演示。
82 0
Java集合Collection接口中的常用方法演示
|
存储 安全 Java
Java集合(4)--List接口及其实现类ArrayList、LinkedList和Vector
Java集合(4)--List接口及其实现类ArrayList、LinkedList和Vector
84 0
Java集合(4)--List接口及其实现类ArrayList、LinkedList和Vector
|
Java
Java中的ArrayList集合(干数组不能干的事)
数组的长度是固定的,不能添加进去新的元素。 集合可以自动扩容,灵活添加元素。
48 0
|
存储 Java 容器
Java中ArrayList,LinkedList,Vector三者的异同点及其使用场景和ArrayList的一些常用方法
相同点:三者存储的都是有序,可重复的数据。 异:①:ArrayList底层存储类型树Object数组,而LinkedList底层是双向链表 ②:ArrayList和Vector调用创建空参构造器创建对象时,默认的size是10,但是当自动扩容的时候,ArrayList扩容为当前容器size的1.5倍,而Vector自动扩容为当前的2倍。 使用场景:①:当查找操作比较多时,使用ArrayList,因为其底层是数组实现,可以根据角标查找,时间复杂度是O(1),而LinkedList底层是双向...
117 0
|
存储 Java
Java集合相关学习——手写一个简单的Map接口实现类(HashMap)
Java集合相关学习——手写一个简单的Map接口实现类(HashMap)
Java集合相关学习——手写一个简单的Map接口实现类(HashMap)
|
存储 Java
Java——集合中的List接口通过LinkedList类实现一些常用的方法
Java——集合中的List接口通过LinkedList类实现一些常用的方法
Java——集合中的List接口通过LinkedList类实现一些常用的方法