1.概述

转载:http://www.javastack.cn/article/2019/why-arraylist-impl-randomaccess-interface/

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

RandomAccess接口,这是为什么呢?

public class ArrayList<E> extends AbstractList<E>implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{private static final long serialVersionUID = 8683452581122892189L;

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

public interface RandomAccess {}

RandomAccess接口

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

接下来我们来举例说明。

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

    public static <T>int binarySearch(List<? extends Comparable<? super T>> list, T key) {if (list instanceof RandomAccess || list.size()<BINARYSEARCH_THRESHOLD)return Collections.indexedBinarySearch(list, key);elsereturn Collections.iteratorBinarySearch(list, key);}

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

indexedBinarySearch 方法

private static <T>int indexedBinarySearch(List<? extends Comparable<? super T>> list, T key) {int low = 0;int high = list.size()-1;while (low <= high) {int mid = (low + high) >>> 1;Comparable<? super T> midVal = list.get(mid);int cmp = midVal.compareTo(key);if (cmp < 0)low = mid + 1;else if (cmp > 0)high = mid - 1;elsereturn mid; // key found}return -(low + 1);  // key not found}

iteratorBinarySearch 方法

 private static <T>int iteratorBinarySearch(List<? extends Comparable<? super T>> list, T key){int low = 0;int high = list.size()-1;ListIterator<? extends Comparable<? super T>> i = list.listIterator();while (low <= high) {int mid = (low + high) >>> 1;Comparable<? super T> midVal = get(i, mid);int cmp = midVal.compareTo(key);if (cmp < 0)low = mid + 1;else if (cmp > 0)high = mid - 1;elsereturn mid; // key found}return -(low + 1);  // key not found}

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

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

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


测试结果如下测试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】ArrayList 为啥要实现 RandomAccess 接口相关推荐

  1. Java ArrayList 为什么要实现 RandomAccess 接口?

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

  2. ArrayList 为什么要实现 RandomAccess 接口?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源 | http://t.cn/AilfR3YW 在我们的开发中 ...

  3. 【java】Java对象为啥要实现Serializable接口?

    1.概述 对于 Java 的序列化,我一直停留在最浅显的认知上--把那个要序列化的类实现 Serializbale 接口就可以了.我不愿意做更深入的研究,因为会用就行了嘛. 但随着时间的推移,见到 S ...

  4. 开课吧之Java常见面试题之RandomAccess接口

    RandomAccess接口?* 查看源码我们发现实际上 RandomAccess 接口中什么都没有定义.所以,在我看来 RandomAccess 接口不过是一个标识罢了.标识什么? 标识实现这个接口 ...

  5. JAVA中RandomAccess接口

    RandomAccess接口 RandomAccess是一个标记接口,实现该接口表示支持快速访问.这是一个空接口,没有任何方法. 当实现该接口时,说明支持快速访问. 即: for (int i=0, ...

  6. java arraylist线程安全_ArrayList升级为线程安全的List

    我们都熟知在高并发的场景下,ArrayList是线程不安全的,JDK Collections接口提供线程安全的操作,本文通过代码演示下,最后查看源码分析下为何是线程安全的. ArrayList升级为线 ...

  7. RandomAccess接口

    RandomAccess是一个标记接口,实现该接口表示支持快速访问.这是一个空接口,没有任何方法. 当实现该接口时,说明支持快速访问. 即: for (int i=0, n=list.size(); ...

  8. ArrayList集合类实现的RandomAccess空接口有何用?

    相信不少小伙伴在查看 ArrayList 集合时发现该集合类实现了一个 RandomAccess 空实现的接口,源码如下 ⬇️ ArrayList 源码: RandomAccess 接口源码: 可以看 ...

  9. Java编程:RandomAccess接口

    RandomAccess 是一个标记接口,标识实现该接口的类支持快速随机访问. 一.随机访问和串行访问 举个例子:在 Java 中,有 ArrayList 和 LinkedList 两种数据类型. A ...

最新文章

  1. Gentoo下keepalived+LVS实验
  2. Ninja提升编译速度的方法-Android10.0编译系统(十)
  3. 【转】VC MFC 如何删除文件,目录,文件夹
  4. python 粒子滤波目标追踪_Python实现基于相关滤波的单目标跟踪算法
  5. OSG模拟鼠标事件影响操纵器
  6. IO多路复用之select
  7. BGP邻居建立及路由传递/解决BGP数据层面路由黑洞实验
  8. Red Hat Enterprise Linux 7.5安装盘内容做本地YUM源
  9. ITIL4定义的四大价值维度
  10. 计算机操作系统-6-并发程序设计
  11. ufw防火墙配置命令
  12. 在linux上将ape转成mp3,以及MP3 大小转换
  13. 新浪实时股票数据接口http://hq.sinajs.cn/list=code
  14. 一道简单的逻辑运算题
  15. XMPP 协议的原理和介绍
  16. 力扣-股票的资本损益
  17. IP地址欺骗 IP Spoof
  18. 我看电影阿凡达(Avatar)
  19. Unity_太阳月亮地球的自转公转脚本
  20. 【财富空间】大风向!未来十年的12个必然趋势

热门文章

  1. 最便宜的骁龙888旗舰机!realme真我GT正式发布:2799元起售
  2. 罗永浩直播间12小时销售破2亿元 网友:《真还传》年内上映指日可待
  3. 未成年人互联网普及率达99% 腾讯等倡议加强青少年网络素养教育
  4. 钱准备好!苹果官方账号泄密:iPhone 12明晚发布有戏
  5. iPhone 12搭载5nm A14芯片:晶体管数量高达150亿
  6. 3月12日见!红魔5G游戏手机正式官宣:全球首款144Hz游戏手机
  7. 美国AI公司宣称特制3D面具破解刷脸支付系统,支付宝、微信:能破解 我全赔...
  8. 2G、3G即将退出群聊;全国携号转网就要实现了;5G商用列车已发车...
  9. 老人机彻底不能用了?联通逐渐关闭2G、3G网络?回应:手机制式不支持
  10. 荣耀推出MOSCHINO联名款荣耀20 PRO手机 售价3799元