博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ArrayList集合实现RandomAccess接口有何作用?为何LinkedList集合却没实现这接口?
阅读量:3686 次
发布时间:2019-05-21

本文共 2712 字,大约阅读时间需要 9 分钟。

众所周知,在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,从而能够更好选择更优的遍历方式,提高性能!

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

--------------------- 
作者:DriveMan 
来源:CSDN 
原文:https://blog.csdn.net/weixin_39148512/article/details/79234817 
版权声明:本文为博主原创文章,转载请附上博文链接!

你可能感兴趣的文章
【Verilog_1】: 设计 4 位 BCD 十进制计数器
查看>>
【Verilog_2】: 设计 n 位乘加器(先乘后加)
查看>>
【verilog_3】: 设计一个可以预置分频器,最大分频系数为 100000
查看>>
【verilog_4】: 设计一个 16 选 1 选择器 Design a 16-to-1 selector
查看>>
【Verilog_5】: 设计一个脉冲发生器,已知系统时钟为 50MHz,生成脉冲宽度为 1ms,脉 冲间隔可调,最大间隔为 1s
查看>>
【verilog_6】: 设计一个 16 位串入并出移位寄存器
查看>>
【verilog_7】: 设计一个 32 位 ALU 支持加法、减法、与、或、异或、取非这六中运算
查看>>
【verilog_8】: 设计60进制计数器,带异步复位、同步使能、同步装载、同步清零、同步置位
查看>>
【verilog_9】: 设计16位二进制计数器,带异步复位、同步使能、同步装载、同步清零、同步置位
查看>>
【Verilog_10】: 设计24位无符号数乘法器
查看>>
【Verilog_11】: 设计一个11分频的分频器,要求输出占空比为50%,不能使用PLL
查看>>
【Verilog_12】: 设计一个7.5分频的分频器,不能使用PLL
查看>>
【Verilog_13】: RTL ←→Verilog
查看>>
数学建模方法 — 【02】模糊综合评价方法
查看>>
数据结构(python)——【05 排序: 冒泡排序】
查看>>
数学建模方法—【07】灰色预测GM(1,1)
查看>>
数学建模方法—【03】拟合优度的计算(python计算)
查看>>
数学建模方法—【04】拟合方法之np.polyfit、np.poly1d
查看>>
Python【Numpy简单介绍】
查看>>
Python 【Series: 一维数据对象】
查看>>