专注于Java领域的优质技术,欢迎关注。
作者:ssdpw_caiyq
在我们的开发中,List接口是最常见的接口,我们几乎每天都在使用ArrayList或LinkedList。但是你有没有注意到ArrayList实现了RandomAccess接口,而LinkedList没有?为什么呢?
随机访问接口为空。什么是随机访问接口?
随机访问接口
RandomAccess是一个标记接口,官方的解释是只要List实现这个接口,就可以支持快速随机访问。什么是随机访问?接下来,我们举个例子。
集合是集合的一个工具类。让我们看看集合源代码中的二分搜索法方法。
从源代码可以看出,判断列表是否是RandomAccess的实例。如果是,则执行indexedBinarySearch方法;如果没有,则执行iteratorBinarySearch方法。让我们来看看这两种方法。
以上两种方法的源代码显示,RandomAccess接口的List被索引遍历,而RandomAccess接口的List没有被迭代器遍历。那么为什么要这样设计呢?
现在涉及到二分搜索法的遍历操作,让我们分析一下ArrayList和LinkedList遍历元素的性能。
测试结果如下
测试遍历数组列表花费的时间:1
测试数组列表遍历迭代器花费的时间:2
测试链接列表遍历所花费的时间:47
测试遍历迭代器的链接列表所花费的时间:1
我们来分析一下测试结果:通过for的ArrayList遍历比迭代器遍历稍快,通过迭代器的LinkedList遍历比for遍历快。
因此,在我们的应用中,要考虑使用List接口的哪个实现类,才能更好、更高效地满足实际场景需求。所以在这里,我们通过实现RandomAccess接口来区分List的哪个实现类。
00-1010最后总结一句话:实现RandomAccess接口的列表可以比迭代器更高效地遍历for循环的数据,而没有实现RandomAccess接口的列表可以比for循环更高效地遍历迭代器的数据。
来源:https://www.jianshu.com/p/3e2a9e4c9e01