ArrayList集合实现RandomAccess接口有何做用?为什么LinkedList集合却没实现这接口?

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

这是为何呢?性能

-----------------------------------------------------------------------------------------------------测试

这是ArrayList实现RandomAccess接口的源码3d

------------------------------------------------------------------------------------------------------对象

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

------------------------------------------------------------------------------------------------------接口

这是RandomAccess接口的源码源码

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

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

经过查看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,从而可以更好选择更优的遍历方式,提升性能!

相关文章
相关标签/搜索