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