众所周知,在List集合中,我们经常会用到ArrayList以及LinkedList集合,但是通过查看源码,就会发现ArrayList实现RandomAccess接口,但是RandomAccess接口里面是空的!Linked并没有实现RandomAccess接口。

这是为什么呢?

-----------------------------------------------------------------------------------------------------

这是ArrayList实现RandomAccess接口的源码

------------------------------------------------------------------------------------------------------

这是LinkedList的源码,并没实现RandomAccess接口

------------------------------------------------------------------------------------------------------

这是RandomAccess接口的源码

原来RandomAccess接口是一个标志接口(Marker),然而实现这个接口有什么作用呢?

解答:只要List集合实现这个接口,就能支持快速随机访问,然而又有人问,快速随机访问是什么东西?有什么作用?

通过查看Collections类中的binarySearch()方法,源码如下:

由此可以看出,判断list是否实现RandomAccess接口来实行indexedBinarySerach(list,key)或iteratorBinarySerach(list,key)方法。ps(instanceof其作用是用来判断某对象是否为某个类或接口类型)

那么,又有人疑问,执行这两个方法有什么不同?

查看下indexedBinarySerach(list,key)方法源码:

-------------------------------------------------------------------------------------------------------------

查看下iteratorBinarySerach(list,key)方法源码:

通过查看源代码,发现实现RandomAccess接口的List集合采用一般的for循环遍历,而未实现这接口则采用迭代器。

接下来,我们将进行下测试ArrayList以及LinkedList采用这两种方法各自的性能是如何!

-------------------------------------------------------------------------------------------------------------

main方法:

-------------------------------------------------------------------------------------------------------------

for循环遍历ArrayList

-------------------------------------------------------------------------------------------------------------

iterator迭代器遍历ArrayList

-------------------------------------------------------------------------------------------------------------

for循环遍历LinkedList

-------------------------------------------------------------------------------------------------------------

iterator迭代器遍历LinkedList


-------------------------------------------------------------------------------------------------------------

运行结果:

从上面数据可以看出,ArrayList用for循环遍历比iterator迭代器遍历快,LinkedList用iterator迭代器遍历比for循环遍历快,

所以说,当我们在做项目时,应该考虑到List集合的不同子类采用不同的遍历方式,能够提高性能!

然而有人发出疑问了,那怎么判断出接收的List子类是ArrayList还是LinkedList呢?

这时就需要用instanceof来判断List集合子类是否实现RandomAccess接口!

代码如下:

-----------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------

main方法:

-----------------------------------------------------------------------------------------------------------------

运行结果:

总结:RandomAccess接口这个空架子的存在,是为了能够更好地判断集合是否ArrayList或者LinkedList,从而能够更好选择更优的遍历方式,提高性能!

真心佳作,实属不易!码农道路,多多指教!

ArrayList集合实现RandomAccess接口有何作用?为何LinkedList集合却没实现这接口?相关推荐

  1. RandomAccess接口有什么作用?

    前言 RandomAccess这个接口有什么作用,明明它的声明只是一个空头支票,里面没有一点的方法,看到源码的介绍说这是为了List能实现快速的随机访问?但是又是有什么用呢? 上代码 * <pr ...

  2. Java集合04 - RandomAccess

    目录 1.什么是RandomAccess 2.RandomAccess具体实现 3.两种遍历方法性能测试 笔者JDK版本:1.8.0_202 1.什么是RandomAccess RandomAcces ...

  3. Java学习之容器上(Collection接口常用方法,Iterator接口,使用foreach循环遍历Collection集合元素,Set集合通用知识(Hashset类,hashcode()与Lin

    1.容器API的类图结构如下: JAVA的集合类是一种特别有用的工具类,它可以用于存储数量不等的多个对象,并可以实现常用数据结构,如栈,队列等,除此之外,JAVA集合还可用于保存具有映射关系的关联数组 ...

  4. java comparable接口_Java面试题之Java集合篇三

    Java面试题之Java集合篇三1.HashMap和HashTable有何不同? (1)HashMap允许key和value为null,而HashTable不允许. (2)HashTable是同步的, ...

  5. Java中的集合父亲之collection使用和遍历方式--(单列集合顶级接口)

    目录 前言必读 一.概念 1.关系网图 2.区别 二.代码例子 使用场景选择: 四.set迭代器遍历 1.为什么要用set迭代器遍历? 2.迭代器是什么? 3.迭代器注意事项 例子展示: 五.增强fo ...

  6. Collection,List,ArrayList,LinkedList集合

    Collection集合 是单例集合的顶层接口,它表示一组对象,这些对象也称为Collection的元素 lJDK 不提供此接口的任何直接实现,它提供更具体的子接口(如Set和List)实现 Coll ...

  7. Java基础(19)数据结构概述、ArrayList集合、Vector集合、LinkedList集合、集合框架练习

    1. 数据结构概述 1. 数据结构的概述:数据结构就是数据存储的方式 2. 常见数据结构:栈,队列,数组,链表,二叉树,哈希表 3. 栈和队列 (1)栈:先进后出,后进先出 (2)队列:先进先出,后进 ...

  8. 【Groovy】集合声明与访问 ( 使用 [] 创建 ArrayList 和 LinkedList 集合 | 集合赋初值 | 使用下标访问集合 | 使用 IntRange 作为下标访问集合 )

    文章目录 一.使用 [] 创建集合 1.使用 [] 创建 ArrayList 集合 2.使用 [] 创建 LinkedList 集合 二.访问集合中的元素 1.集合赋初值 2.使用下标访问集合元素 ( ...

  9. java 集合接口原理_图文剖析java集合框架—Set接口

    Map接口图补充待续 继上一节讲解了List接口的常用实现类以及源码的一些分析,这节将讲解集合中的Set接口. HashSet: 底层原理:哈希表结构存储.对集合的迭代次序不作任何保证; 允许元素nu ...

最新文章

  1. ATS cache中的几个数据结构图收集
  2. SQL2K数据库开发十一之表操作创建UNIQUE约束
  3. php 反序列化漏洞简介
  4. bzoj 2007 海拔 —— 最短路
  5. 1042 mysql57_一次处理DB2宕机的实战经历(SQL1042C )
  6. ProxmoxVE(V5.2) 之 使用外部ceph存储(luminous)
  7. 学校学生工科学生接私活_为什么我要在学校教年轻的学生如何编码
  8. 360互联网训练营第十四期——大数据技术开放日
  9. 语音识别双十一优惠活动
  10. 20050909:女乘客钓男司机?
  11. 强大的.NET反编译工具Reflector及插件 (转)
  12. 安装软件后,在postinst中执行ldconfig无效?
  13. 关于office2010的mso问题和卸载重装问题
  14. 计算机基础——Word 2010
  15. 关于拉勾网的scrapy crawlspider爬虫出现的302问题的解决方式
  16. 优化-处理大量定时任务的思路
  17. OPA277/OPA2277/OPA4277 High Precision Operational Amplifiers 高精度运放
  18. 哈哈日语 日语五十音学记资料汇编
  19. Quartz 是什么
  20. O365 EMS M365的区别?

热门文章

  1. head first java 最新版_Head First Java.(第2版)
  2. 针对L型区域的椭圆方程的差分法
  3. 前端微信签名验证工具_js实现微信公众号签名算法
  4. Android两个canvas混合叠加,Android Canvas设置绘画时重叠部分的处理模式【含效果图】...
  5. GIMP的安装和使用
  6. coco数据集大小分类_VOC、COCO数据集类别
  7. JS 数组,对象。中划线、数字属性时值获取
  8. UiPath是做什么的
  9. 搭建wnmp开发环境
  10. js原生、jquery单选框radio总结(获取值、设置默认选中值、样式)