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

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

  • 相关阅读:
    Python 集合
    Python sorted()
    CodeForces 508C Anya and Ghosts
    CodeForces 496B Secret Combination
    CodeForces 483B Friends and Presents
    CodeForces 490C Hacking Cypher
    CodeForces 483C Diverse Permutation
    CodeForces 478C Table Decorations
    CodeForces 454C Little Pony and Expected Maximum
    CodeForces 313C Ilya and Matrix
  • 原文地址:https://www.cnblogs.com/java-stack/p/11952159.html
Copyright © 2011-2022 走看看