Java集合04 - RandomAccess
目录
1.什么是RandomAccess
2.RandomAccess具体实现
3.两种遍历方法性能测试
笔者JDK版本:1.8.0_202
1.什么是RandomAccess
RandomAccess和Cloneable、Serializable接口一样,本质上都是一种标志性接口,无具体实现,意在告知JVM此类(在恒定时间内)可支持快速随机访问。源码中一大段话翻译过来讲了这么几件事:
(1)给List使用的标记型接口,目的是使其支持(在恒定时间内)的快速随机访问
(2)推荐在遍历集合的时候检查该List是否实现了RandomAccess接口,以便让不同的集合使用更优的遍历算法(ArrayList用for循环遍历快一些,LinkedList用迭代器遍历快一些)
(3)通常来说,如果一个List用for循环遍历比用迭代器遍历的速度快,那么推荐实现RandomAccess接口
2.RandomAccess具体实现
Java中的Collectons类提供了静态操作集合的方法,一起看下Collectons中对RandomAccess接口的判断:
如果这个集合实现了RandomAccess接口或者集合大小小于二分查找阀值时,按下标二分查找,否则使用迭代器实现二分查找,对应源码中说到的第2点和第3点。
3.两种遍历方法性能测试
DEMO:
private static void computingTime(List list) {long startTime;long endTime;if (list instanceof RandomAccess) {System.out.println(list.getClass() + "实现了RandomAccess接口");} else {System.out.println(list.getClass() + "未实现RandomAccess接口");}startTime = System.currentTimeMillis();for (int i = 0; i < list.size(); i++) {Object o = list.get(i);}endTime = System.currentTimeMillis();System.out.println("采用for循环的方式遍历集合耗时:" + (endTime - startTime) + "ms");startTime = System.currentTimeMillis();for (Iterator iter = list.iterator(); iter.hasNext(); ) {Object o = iter.next();}endTime = System.currentTimeMillis();System.out.println("采用迭代器的方式遍历集合耗时:" + (endTime - startTime) + "ms");
}
public static void main(String[] args) {ArrayList<Integer> arrayList = new ArrayList<>();int listSize = 100000;for (int i = 0; i < listSize; i++) {arrayList.add(i);}List<Integer> linkedList = new LinkedList<>();for (int i = 0; i < listSize; i++) {linkedList.add(i);}computingTime(arrayList);computingTime(linkedList);
}
测试demo很简单,10W条数据存入ArrayList和LinkedList后,分别用for循环和迭代器来遍历这两个集合记录遍历时间。通过结果可知,ArrayList for循环遍历的时间小于迭代器遍历时间,而LinkedList for循环遍历的时间选超迭代器遍历时间。原因就和这两个集合的底层实现有关了(在接下来的文章内会详谈),ArrayList底层动态扩容数组,查询时间复杂度O(1),所以两种方式遍历区别不大,快速随机访问略胜一筹;而LinkedList底层基于双向循环链表,因为链表的特性,迭代器查找比快速随机访问(时间复杂度O(n))快的多。
Java集合04 - RandomAccess相关推荐
- 【重难点】【Java集合 04】ArrayDeque 的使用场景、ArrayBlockingQueue
[重难点][Java集合 04]ArrayDeque 的使用场景.ArrayBlockingQueue 的源码实现 文章目录 [重难点][Java集合 04]ArrayDeque 的使用场景.Arra ...
- Java 集合系列04之 fail-fast总结
转载自 Java 集合系列04之 fail-fast总结 概要 前面,我们已经学习了ArrayList.接下来,我们以ArrayList为例,对Iterator的fail-fast机制进行了解.内 ...
- Java 集合系列04之 fail-fast总结(通过ArrayList来说明fail-fast的原理、解决办法)
http://www.cnblogs.com/skywang12345/p/3308762.html 概要 前面,我们已经学习了ArrayList.接下来,我们以ArrayList为例,对Iterat ...
- Java知识点04——集合(Set、List、Queue、Map、Collection和Iterator、Collections工具类)
Java知识点04--集合(Set.List.Queue.Map.Collection.Iterator.Collections工具类) 一.集合 1.1 集合概述 二.Collection 2.1 ...
- Java集合源码分析(二)ArrayList
ArrayList简介 ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,类似于C语言中的动态申请内存,动态增长内存. ArrayList不是线程安全的,只能用在单线程环境下,多线 ...
- Java 集合系列06: Vector深入解析
戳上面的蓝字关注我们哦! 精彩内容 精选java等全套视频教程 精选java电子图书 大数据视频教程精选 java项目练习精选 概论 这是接着以前的文章分享的,这里给出以前的文章的连接,供小伙伴们回顾 ...
- Java 集合系列(3): fail-fast总结(通过ArrayList来说明fail-fast的原理、解决办法)...
戳上面的蓝字关注我们哦! 精彩内容 精选java等全套视频教程 精选java电子图书 大数据视频教程精选 java项目练习精选 概要 前面,我们已经学习了ArrayList.接下来,我们以ArrayL ...
- Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例
转载自 Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例 第1部分 ArrayList介绍 ArrayList简介 ArrayList 是一个数组队列,相当于 动态数组.与 ...
- java集合框架容器 java框架层级 继承图结构 集合框架的抽象类 集合框架主要实现类...
本文关键词: java集合框架 框架设计理念 容器 继承层级结构 继承图 集合框架中的抽象类 主要的实现类 实现类特性 集合框架分类 集合框架并发包 并发实现类 什么是容器? 由一个或多个确 ...
最新文章
- RDKit:化合物相似性搜索
- Android11有哪些vts
- 安顺计算机二级考试,安顺市2020年3月计算机二级报名时间|网上报名入口【12月18日9:00开通】...
- 实例演示oracle注入获取cmdshell的全过程
- go kegg_KEGG分析及可视化
- go:linkname
- 【原创】开源Math.NET基础数学类库使用(05)C#解析Delimited Formats数据格式
- stc89c51单片机音乐盒系统设计_基于单片机的火控系统语音报读设计
- 苹果13英寸MacBook Pro有望下月更新 搭载M2芯片
- [HDU3507]Print Article
- 持续集成(4)工具对比
- Win10 Composer下载安装
- b 站视频下载神器合集,支持电脑和手机端
- 发卡行 收单行 收单
- Mortal Kombat Tower(dp)
- 【睡觉中的阿狸!真的被萌到啦】
- 在Eclipse上搭建Android开发环境
- 蛋花花:人工智能写的诗版权到底算谁的
- ROWNUM 与 ROW_NUMBER()OVER() 的区别
- 论文种类分类Task4