ArrayList集合实现RandomAccess接口有何作用?为何LinkedList集合却没实现这接口?
众所周知,在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集合却没实现这接口?相关推荐
- RandomAccess接口有什么作用?
前言 RandomAccess这个接口有什么作用,明明它的声明只是一个空头支票,里面没有一点的方法,看到源码的介绍说这是为了List能实现快速的随机访问?但是又是有什么用呢? 上代码 * <pr ...
- Java集合04 - RandomAccess
目录 1.什么是RandomAccess 2.RandomAccess具体实现 3.两种遍历方法性能测试 笔者JDK版本:1.8.0_202 1.什么是RandomAccess RandomAcces ...
- Java学习之容器上(Collection接口常用方法,Iterator接口,使用foreach循环遍历Collection集合元素,Set集合通用知识(Hashset类,hashcode()与Lin
1.容器API的类图结构如下: JAVA的集合类是一种特别有用的工具类,它可以用于存储数量不等的多个对象,并可以实现常用数据结构,如栈,队列等,除此之外,JAVA集合还可用于保存具有映射关系的关联数组 ...
- java comparable接口_Java面试题之Java集合篇三
Java面试题之Java集合篇三1.HashMap和HashTable有何不同? (1)HashMap允许key和value为null,而HashTable不允许. (2)HashTable是同步的, ...
- Java中的集合父亲之collection使用和遍历方式--(单列集合顶级接口)
目录 前言必读 一.概念 1.关系网图 2.区别 二.代码例子 使用场景选择: 四.set迭代器遍历 1.为什么要用set迭代器遍历? 2.迭代器是什么? 3.迭代器注意事项 例子展示: 五.增强fo ...
- Collection,List,ArrayList,LinkedList集合
Collection集合 是单例集合的顶层接口,它表示一组对象,这些对象也称为Collection的元素 lJDK 不提供此接口的任何直接实现,它提供更具体的子接口(如Set和List)实现 Coll ...
- Java基础(19)数据结构概述、ArrayList集合、Vector集合、LinkedList集合、集合框架练习
1. 数据结构概述 1. 数据结构的概述:数据结构就是数据存储的方式 2. 常见数据结构:栈,队列,数组,链表,二叉树,哈希表 3. 栈和队列 (1)栈:先进后出,后进先出 (2)队列:先进先出,后进 ...
- 【Groovy】集合声明与访问 ( 使用 [] 创建 ArrayList 和 LinkedList 集合 | 集合赋初值 | 使用下标访问集合 | 使用 IntRange 作为下标访问集合 )
文章目录 一.使用 [] 创建集合 1.使用 [] 创建 ArrayList 集合 2.使用 [] 创建 LinkedList 集合 二.访问集合中的元素 1.集合赋初值 2.使用下标访问集合元素 ( ...
- java 集合接口原理_图文剖析java集合框架—Set接口
Map接口图补充待续 继上一节讲解了List接口的常用实现类以及源码的一些分析,这节将讲解集合中的Set接口. HashSet: 底层原理:哈希表结构存储.对集合的迭代次序不作任何保证; 允许元素nu ...
最新文章
- ATS cache中的几个数据结构图收集
- SQL2K数据库开发十一之表操作创建UNIQUE约束
- php 反序列化漏洞简介
- bzoj 2007 海拔 —— 最短路
- 1042 mysql57_一次处理DB2宕机的实战经历(SQL1042C )
- ProxmoxVE(V5.2) 之 使用外部ceph存储(luminous)
- 学校学生工科学生接私活_为什么我要在学校教年轻的学生如何编码
- 360互联网训练营第十四期——大数据技术开放日
- 语音识别双十一优惠活动
- 20050909:女乘客钓男司机?
- 强大的.NET反编译工具Reflector及插件 (转)
- 安装软件后,在postinst中执行ldconfig无效?
- 关于office2010的mso问题和卸载重装问题
- 计算机基础——Word 2010
- 关于拉勾网的scrapy crawlspider爬虫出现的302问题的解决方式
- 优化-处理大量定时任务的思路
- OPA277/OPA2277/OPA4277 High Precision Operational Amplifiers 高精度运放
- 哈哈日语 日语五十音学记资料汇编
- Quartz 是什么
- O365 EMS M365的区别?
热门文章
- head first java 最新版_Head First Java.(第2版)
- 针对L型区域的椭圆方程的差分法
- 前端微信签名验证工具_js实现微信公众号签名算法
- Android两个canvas混合叠加,Android Canvas设置绘画时重叠部分的处理模式【含效果图】...
- GIMP的安装和使用
- coco数据集大小分类_VOC、COCO数据集类别
- JS 数组,对象。中划线、数字属性时值获取
- UiPath是做什么的
- 搭建wnmp开发环境
- js原生、jquery单选框radio总结(获取值、设置默认选中值、样式)