ArrayList 为啥要实现 RandomAccess 接口?

简介: 在我们的开发中,List接口是最常见不过,而且我们几乎每天都在用ArrayList或者LinkedList,但是细心的同学有没有发现,ArrayList中实现了RandomAccess接口,而LinkedList却没有实现

在我们的开发中,List接口是最常见不过,而且我们几乎每天都在用ArrayList或者LinkedList,但是细心的同学有没有发现,ArrayList中实现了RandomAccess接口,而LinkedList却没有实现


RandomAccess接口,这是为什么呢?

image.png



RandomAccess接口中是空的,RandomAccess接口又是什么呢?


image.png


RandomAccess接口

RandomAccess是一个标记接口,官方解释是只要List实现这个接口,就能支持快速随机访问。而什么是随机访问呢?


接下来我们来举例说明。


Collections是集合的一个工具类,我们看一下Collections源码中的二分搜索方法。


image.png


在源码中可以看出,判断list是否是RandomAccess的实例,如果是,则执行indexedBinarySearch方法,如果不是,则执行iteratorBinarySearch方法。接下来看一下这两个方法。


image.png

image.png





上述两个方法的源码表示,实现了RandomAccess接口的List使用索引遍历,而未实现RandomAccess接口的List使用迭代器遍历。


那么为什么要这么设计呢?


既然涉及到二分搜索的遍历操作,那么现在我们来分析一下ArrayList和LinkedList遍历元素的性能如何?



image.pngimage.pngimage.png







测试结果如下测试ArrayList通过for遍历所消耗时间:1


测试ArrayList通过iterator遍历所消耗时间:2


测试LinkedList通过for遍历所消耗时间:47


测试LinkedList通过iterator遍历所消耗时间:1


我们来分析一下测试结果:ArrayList通过for遍历比通过iterator遍历要稍快,LinkedList通过iterator遍历比通过for遍历要快。


所以说在我们的应用中,要考虑使用List接口的哪种实现类,可以更好更高效的满足实际场景需求。所以在这里通过实现RandomAccess接口来区分List的哪种实现类。


总结

最后总结一句话:实现RandomAccess接口的List可以通过for循环来遍历数据比使用iterator遍历数据更高效,未实现RandomAccess接口的List可以通过iterator遍历数据比使用for循环来遍历数据更高效。


相关文章
|
5月前
|
JSON API 数据安全/隐私保护
《揭秘:抖音电商 API 接口,让直播带货数据精准掌控!》
在数字营销时代,抖音电商API为直播带货提供数据支持。通过API可实时获取销售、用户互动等关键数据,助力商家优化策略,实现自动化分析与精准营销,提升效率并驱动业务增长。
453 0
|
10月前
|
Java 关系型数据库 数据库连接
mybatis中的useGeneratedKeys和keyProperty
在 MyBatis 中,`useGeneratedKeys` 和 `keyProperty` 是用于处理数据库自动生成主键的关键配置。通过这些配置,可以方便地获取和使用数据库生成的主键值,提高开发效率和代码可读性。确保正确配置和使用这两个属性,可以在应用程序中高效地进行数据库操作。
375 25
|
8月前
|
SQL Java 数据库连接
MyBatis 实现分页的机制
MyBatis 的分页机制主要依赖于 `RowBounds` 对象和分页插件。`RowBounds` 实现内存分页,适合小数据量场景,通过设定偏移量和限制条数对结果集进行筛选。而针对大数据量,则推荐使用分页插件(如 PageHelper),实现物理分页。插件通过拦截 SQL 执行,动态修改语句添加分页逻辑,支持多种数据库方言。配置插件后,无需手动调整查询方法即可完成分页操作,提升性能与灵活性。
171 0
|
算法 定位技术 网络架构
网络的分类与性能指标
可以分为广域网(WAN)、城域网(MAN)、局域网(LAN)、个人区域网(PAN)。
442 4
|
8月前
|
存储 关系型数据库 索引
索引的底层数据结构
索引是在存储引擎中实现的,也就是说不同的存储引擎,会使用不同的索引 MyISAM和InnoDB存储引擎:只⽀支持B+ TREE索引, 也就是说默认使用BTREE,不能够更换 MEMORY/HEAP存储引擎:支持HASH和BTREE索引
|
Java
Java 中 IO 流的分类详解
【10月更文挑战第10天】不同类型的 IO 流具有不同的特点和适用场景,我们可以根据具体的需求选择合适的流来进行数据的输入和输出操作。在实际应用中,还可以通过组合使用多种流来实现更复杂的功能。
366 57
|
API C语言 C++
FFmpeg入门及编译 2
FFmpeg入门及编译
335 0
|
缓存 监控 算法
如何优化Java应用的响应时间
如何优化Java应用的响应时间
|
SQL Java 数据库连接
Mybatis中@Param的用法和作用
Mybatis中@Param的用法和作用
514 11
|
Java 编译器
【java面试】- java反射以及优缺点
java反射以及优缺点
502 0