专注Java领域优质技术,欢迎关注。
作者:蔡先森_caiyq
在我们的开发中,List接口是最常见的一种,我们几乎每天都会用到ArrayList或者LinkedList。但是细心的同学有没有发现ArrayList实现了RandomAccess接口,而LinkedList没有?为什么?
RandomAccess接口是空的,但是RandomAccess接口是什么呢?
随机访问接口
RandomAccess是一个标记接口。官方的解释是,只要List实现了这个接口,就可以支持快速随机访问。什么是随机存取?接下来,我们举个例子。
集合是集合的工具类。让我们看看集合源代码中的方法。
在源代码中,可以看出列表是否是RandomAccess的实例。如果是,则执行indexedBinarySearch方法;如果不是,则执行iteratorBinarySearch方法。我们来看看这两种方法。
上面两种方法的源代码都说明了有RandomAccess接口的链表是用索引遍历的,没有RandomAccess接口的链表是用迭代器遍历的。那么为什么要这样设计呢?
由于涉及到的遍历操作,现在我们来分析ArrayList和LinkedList遍历元素的性能。
测试结果如下
测试数组列表遍历花费的时间:1元
测试遍历迭代器:密室逃脱:冠军联赛的ArrayList运行时间
测试LinkedList遍历所用的时间:47元
测试LinkedList遍历迭代器所用的时间:1元
我们来分析一下测试结果:ArrayList遍历for比迭代器遍历稍快,LinkedList遍历迭代器比遍历for快。
所以在我们的应用中,要考虑列表接口的哪个实现类更好更高效的满足实际场景需求。所以在这里,我们可以通过实现RandomAccess接口来区分List是哪个实现类。
最后给出一个总结:实现RandomAccess接口的列表通过for循环遍历数据比通过迭代器更高效,没有实现RandomAccess接口的列表通过迭代器遍历数据比通过for循环更高效。
资料来源:https://www.jianshu.com/p/3e2a9e4c9e01