ArrayList为什么要实现RandomAccess接口?

点击上方Java之间”,选择“置顶或者星标”

你关注的就是我关心的!

ArrayList为什么要实现RandomAccess接口?_第1张图片

作者:蔡先森_caiyq

来源:https://www.jianshu.com/p/3e2a9e4c9e01


上一篇:史上最强多线程面试47题(含答案),建议收藏

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

ArrayList为什么要实现RandomAccess接口?_第2张图片

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

640?wx_fmt=png

RandomAccess接口

RandomAccess是一个标记接口,官方解释是只要List实现这个接口,就能支持快速随机访问。 而什么是随机访问呢? 接下来我们来举例说明。 Collections是集合的一个工具类,我们看一下Collections源码中的二分搜索方法。

ArrayList为什么要实现RandomAccess接口?_第3张图片

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

ArrayList为什么要实现RandomAccess接口?_第4张图片

ArrayList为什么要实现RandomAccess接口?_第5张图片

上述两个方法的源码表示,实现了RandomAccess接口的List使用索引遍历,而未实现RandomAccess接口的List使用迭代器遍历。那么为什么要这么设计呢? 既然涉及到二分搜索的遍历操作,那么现在我们来分析一下ArrayList和LinkedList遍历元素的性能如何?

ArrayList为什么要实现RandomAccess接口?_第6张图片

 
   测试结果如下 
   
我们来分析一下测试结果: ArrayList通过for遍历比通过iterator遍历要稍快,LinkedList通过iterator遍历比通过for遍历要快。 所以说在我们的应用中,要考虑使用List接口的哪种实现类,可以更好更高效的满足实际场景需求。 所以在这里通过实现RandomAccess接口来区分List的哪种实现类。

总结

最后总结一句话: 实现RandomAccess接口的List可以通过for循环来遍历数据比使用iterator遍历数据更高效,未实现RandomAccess接口的List可以通过iterator遍历数据比使用for循环来遍历数据更高效。 640?wx_fmt=png 最近热文阅读:
1、史上最强多线程面试47题(含答案),建议收藏 2、天天吹微服务,单体应用有啥不好? 3、 12 个免费又酷炫的 IntelliJ IDEA 插件!
4、学Redis这篇就够了!
5、Java中检查空字符串(null或空白)的方法有几种?
6、惊悚!一次惊心动魄的服务器误删文件的恢复过程! 7、面试问你红黑树,你都懂了吗 8、面试官:数据量很大,分页查询很慢,怎么优化? 9、前后端分离开发思路的探讨 10、Java 中的 jar ,天天见,可是你知道它的运行机制吗? 640?wx_fmt=jpeg 关注公众号,你想要的Java都在这里

你可能感兴趣的:(ArrayList为什么要实现RandomAccess接口?)