zoukankan      html  css  js  c++  java
  • 难倒你了吧!ArrayList 为啥要实现 RandomAccess 接口?

    640?wx_fmt=jpeg

    作者:蔡先森_caiyq

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


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


    RandomAccess接口,这是为什么呢?


    640?wx_fmt=jpeg


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


    640?wx_fmt=jpeg


    RandomAccess接口


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


    640?wx_fmt=jpeg


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


    640?wx_fmt=jpeg


    640?wx_fmt=jpeg


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


    640?wx_fmt=jpeg


    640?wx_fmt=jpeg


    640?wx_fmt=jpeg


    640?wx_fmt=jpeg


    测试结果如下测试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循环来遍历数据更高效。

    关注Java技术栈微信公众号,在后台回复关键字:Java,可以获取一份栈长整理的 Java 最新技术干货。

    最近干货分享

    推荐一款阿里开源的 Java 诊断工具,好用到爆!

    Java必备主流技术流程图,写得非常好!

    Intellij IDEA 智能补全的 10 个姿势!

    Spring Boot 面试,一个问题就干趴下了

    分享一份Java架构师学习资料

    640

    点击「阅读原文」加入栈长的战队~

  • 相关阅读:
    javascript的组成
    BOM
    相等操作符
    arguments
    数组
    Tomcat日志时间的时区问题
    利用脚本批量操作Solr集群(SolrCloud)
    Solr的schema.xml(managedschema)文件
    Solr报警告The _default configset could not be uploaded
    Ubuntu创建用户
  • 原文地址:https://www.cnblogs.com/java-stack/p/11952159.html
Copyright © 2011-2022 走看看